Esempio n. 1
0
        static void RunApp(string[] args)
        {
            var app = new CastaneaApplication();

            var repositoriesFile = args.FirstOrDefault();

            var config = new NuGetConfig {
                RepositoriesConfig = repositoriesFile
            };

            if (args.Length > 1)
            {
                config.OutputDirectory = args[1];
            }

            if (args.Length > 2)
            {
                config.NuGetExePath = args[2];
            }

            if (args.Length > 3)
            {
                string argument = args[3];

                config.DisableParallelProcessing = argument != null &&
                                                   argument.Equals("DisableParallelProcessing",
                                                                   StringComparison.InvariantCultureIgnoreCase);
            }

            if (args.Length > 4)
            {
                string argument = args[4];

                config.NoCache = argument != null &&
                                 argument.Equals("NoCache",
                                                 StringComparison.InvariantCultureIgnoreCase);
            }

            app.RestoreAllSolutionPackages(config, logInfo: Console.WriteLine, logError: Console.Error.WriteLine);
        }
Esempio n. 2
0
        static void RunApp(string[] args)
        {
            var app = new CastaneaApplication();

            var repositoriesFile = args.FirstOrDefault();

            var config = new NuGetConfig {RepositoriesConfig = repositoriesFile};

            if (args.Length > 1)
            {
                config.OutputDirectory = args[1];
            }

            if (args.Length > 2)
            {
                config.NuGetExePath = args[2];
            }

            if (args.Length > 3)
            {
                string argument = args[3];

                config.DisableParallelProcessing = argument != null &&
                                                   argument.Equals("DisableParallelProcessing",
                                                       StringComparison.InvariantCultureIgnoreCase);
            }

            if (args.Length > 4)
            {
                string argument = args[4];

                config.NoCache = argument != null &&
                                 argument.Equals("NoCache",
                                     StringComparison.InvariantCultureIgnoreCase);
            }

            app.RestoreAllSolutionPackages(config, logInfo: Console.WriteLine, logError: Console.Error.WriteLine);
        }
Esempio n. 3
0
        public async Task <ExitCode> ExecuteAsync(
            ILogger logger,
            IReadOnlyCollection <IVariable> buildVariables,
            CancellationToken cancellationToken)
        {
            var app = new CastaneaApplication();

            PathLookupSpecification pathLookupSpecification = DefaultPaths.DefaultPathLookupSpecification;

            string vcsRoot       = buildVariables.Require(WellKnownVariables.SourceRoot).ThrowIfEmptyValue().Value;
            string nuGetExetPath = buildVariables.Require(WellKnownVariables.ExternalTools_NuGet_ExePath)
                                   .ThrowIfEmptyValue()
                                   .Value;

            var rootDirectory = new DirectoryInfo(vcsRoot);

            int listFilesAttempt = 1;

            int listFilesMaxAttempts = 5;

            bool listFilesSucceeded = false;

            IReadOnlyCollection <string>   packagesConfigFiles = new List <string>();
            IReadOnlyCollection <FileInfo> solutionFiles       = new List <FileInfo>();

            while (listFilesAttempt <= listFilesMaxAttempts && !listFilesSucceeded)
            {
                try
                {
                    rootDirectory.Refresh();

                    packagesConfigFiles =
                        rootDirectory.EnumerateFiles("packages.config", SearchOption.AllDirectories)
                        .Where(file => !pathLookupSpecification.IsFileBlackListed(file.FullName, vcsRoot).Item1)
                        .Select(file => file.FullName)
                        .ToReadOnlyCollection();

                    rootDirectory.Refresh();

                    solutionFiles =
                        rootDirectory.EnumerateFiles("*.sln", SearchOption.AllDirectories)
                        .Where(file => !pathLookupSpecification.IsFileBlackListed(file.FullName, vcsRoot).Item1)
                        .ToReadOnlyCollection();

                    listFilesSucceeded = true;
                }
                catch (Exception ex)
                {
                    if (listFilesAttempt == listFilesMaxAttempts)
                    {
                        logger.WriteError($"Could not enumerable packages.config files or solutions files. {ex}");
                        return(ExitCode.Failure);
                    }

                    logger.WriteWarning(
                        $"Attempt {listFilesAttempt} of {listFilesMaxAttempts} failed, retrying. {ex}");
                    listFilesAttempt++;
                }
            }

            if (!packagesConfigFiles.Any())
            {
                logger.WriteWarning("Could not find any packages.config files, skipping package restore");
                return(ExitCode.Success);
            }

            if (!solutionFiles.Any())
            {
                logger.WriteError("Could not find any solution file, cannot determine package output directory");
                return(ExitCode.Failure);
            }

            if (solutionFiles.Count > 1)
            {
                logger.WriteError("Found more than one solution file, cannot determine package output directory");
                return(ExitCode.Failure);
            }

            FileInfo solutionFile = solutionFiles.Single();

            string allFiles = string.Join(Environment.NewLine, packagesConfigFiles);

            try
            {
// ReSharper disable once PossibleNullReferenceException
                string outputDirectoryPath = Path.Combine(solutionFile.Directory.FullName, "packages");

                new DirectoryInfo(outputDirectoryPath).EnsureExists();

                bool disableParallelProcessing =
                    buildVariables.GetBooleanByKey(
                        WellKnownVariables.NuGetRestoreDisableParallelProcessing,
                        false);

                bool noCache = buildVariables.GetBooleanByKey(
                    WellKnownVariables.NuGetRestoreNoCache,
                    false);

                var nuGetConfig = new NuGetConfig
                {
                    NuGetExePath              = nuGetExetPath,
                    OutputDirectory           = outputDirectoryPath,
                    DisableParallelProcessing = disableParallelProcessing,
                    NoCache = noCache
                };

                nuGetConfig.PackageConfigFiles.AddRange(packagesConfigFiles);

                Action <string> debugAction = null;

                string prefix = typeof(CastaneaApplication).Namespace;

                if (logger.LogLevel.IsLogging(LogLevel.Verbose))
                {
                    debugAction = message => logger.WriteVerbose(message, prefix);
                }

                int restoredPackages = 0;

                int attempt = 1;

                int maxAttempts = 5;

                bool succeeded = false;

                while (attempt <= maxAttempts && !succeeded)
                {
                    try
                    {
                        restoredPackages = app.RestoreAllSolutionPackages(
                            nuGetConfig,
                            message => logger.Write(message, prefix),
                            message => logger.WriteError(message, prefix),
                            debugAction);

                        if (restoredPackages == 0)
                        {
                            logger.WriteWarning($"No packages was restored as defined in {allFiles}");
                            return(ExitCode.Success);
                        }

                        succeeded = true;
                    }
                    catch (Exception ex)
                    {
                        if (attempt < maxAttempts)
                        {
                            logger.WriteWarning(
                                $"Attempt {attempt} of {maxAttempts}: could not restore NuGet packages, trying againg. {ex.Message}");
                        }
                        else
                        {
                            logger.WriteError($"Could not restore NuGet packages.{ex}");
                            return(ExitCode.Failure);
                        }

                        attempt++;
                    }
                }

                logger.Write($"Restored {restoredPackages} package configurations defined in {allFiles}");
            }
            catch (Exception ex)
            {
                logger.WriteError($"Could not restore packages defined in '{allFiles}'. {ex}");
                return(ExitCode.Failure);
            }

            try
            {
                foreach (FileInfo fileInfo in solutionFiles)
                {
                    // ReSharper disable once PossibleNullReferenceException
                    string packagesDirectory = Path.Combine(fileInfo.Directory.FullName, "packages");

                    if (Directory.Exists(packagesDirectory))
                    {
                        foreach (INuGetPackageRestoreFix nuGetPackageRestoreFix in _fixes)
                        {
                            await nuGetPackageRestoreFix.FixAsync(packagesDirectory, logger);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (ExceptionExtensions.IsFatal(ex))
                {
                    throw;
                }

                logger.WriteWarning(ex.ToString());
            }

            return(ExitCode.Success);
        }