Esempio n. 1
0
        public static PackageAnalysisContext Create(
            ITestOutputHelper output,
            ManifestMetadata metadata,
            string[] emptyFiles = null,
            string signRequest  = null)
        {
            var disposableDirectory = new DisposableDirectory();
            var basePath            = disposableDirectory.Path;
            var nupkgFileName       = $"{PackageId}.{metadata.Version}.nupkg";
            var nupkgPath           = Path.Combine(basePath, nupkgFileName);

            // set required metadata
            metadata.Id          = metadata.Id ?? "Test";
            metadata.Version     = metadata.Version ?? new NuGetVersion("1.0.0");
            metadata.Authors     = metadata.Authors.Any() ? metadata.Authors : new[] { "test" };
            metadata.Description = metadata.Description ?? "Description";

            // prevent PackageException for packages with no dependencies or content
            emptyFiles = emptyFiles ?? new[] { "_._" };

            var builder = new PackageBuilder();

            builder.Populate(metadata);

            using (var nupkg = File.Create(nupkgPath))
            {
                foreach (var dest in emptyFiles)
                {
                    var fileName = Path.GetFileName(dest);
                    File.WriteAllText(Path.Combine(basePath, fileName), "");
                    builder.AddFiles(basePath, fileName, dest);
                }

                builder.Save(nupkg);
            }

            SignRequestItem packageSignRequest = null;

            if (signRequest != null)
            {
                var reader       = new StringReader(signRequest);
                var signManifest = SignRequestManifestXmlReader.Load(reader, basePath);
                packageSignRequest = signManifest.First(f => f.Path == nupkgFileName);
            }

            var context = new TestPackageAnalysisContext(disposableDirectory)
            {
                Logger          = new TestLogger(output),
                PackageFileInfo = new FileInfo(nupkgPath),
                SignRequest     = packageSignRequest,
                Metadata        = builder,
            };

            return(context);
        }
Esempio n. 2
0
        public static int Main(string[] args)
        {
            var application = new CommandLineApplication();

            application.HelpOption("--help");
            var verbose          = application.Option("--verbose", "Verbose output and assistance", CommandOptionType.NoValue);
            var ruleFile         = application.Option("--rule-file", "Path to NPV.json", CommandOptionType.SingleValue);
            var excludedRules    = application.Option("--excluded-rule", "Rules to exclude. Calculcated after composite rules are evaluated.", CommandOptionType.MultipleValue);
            var signRequest      = application.Option("--sign-request", "Sign request manifest file.", CommandOptionType.SingleValue);
            var packageDirectory = application.Argument("Package directory", "Package directory to scan for nupkgs");

            application.OnExecute(() =>
            {
                var totalTimeStopWatch = Stopwatch.StartNew();
                if (string.IsNullOrEmpty(packageDirectory.Value))
                {
                    application.Error.WriteLine($"Missing required argument {packageDirectory.Name}");
                    application.ShowHelp();
                    return(ReturnBadArgs);
                }

                if (!ruleFile.HasValue())
                {
                    application.Error.WriteAsync($"Missing required option {ruleFile.Template}.");
                    application.ShowHelp();
                    return(ReturnBadArgs);
                }

                var hideInfoLogs = verbose.HasValue();

                IPackageVerifierLogger logger;
                if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TEAMCITY_VERSION")))
                {
                    logger = new TeamCityLogger(hideInfoLogs);
                }
                else
                {
                    logger = new PackageVerifierLogger(hideInfoLogs);
                }

                // TODO: Show extraneous packages, exclusions, etc.
                var ignoreAssistanceMode = verbose.HasValue() ? IgnoreAssistanceMode.ShowAll : IgnoreAssistanceMode.ShowNew;

                var ruleFileContent = File.ReadAllText(ruleFile.Value());
                var packageSets     = JsonConvert.DeserializeObject <IDictionary <string, PackageSet> >(
                    ruleFileContent,
                    new JsonSerializerSettings
                {
                    MissingMemberHandling = MissingMemberHandling.Error
                });


                var signRequestManifest = signRequest.HasValue()
                    ? SignRequestManifestXmlReader.Load(signRequest.Value())
                    : default;

                logger.LogNormal("Read {0} package set(s) from {1}", packageSets.Count, ruleFile.Value());
                var nupkgs = new DirectoryInfo(packageDirectory.Value).EnumerateFiles("*.nupkg", SearchOption.TopDirectoryOnly)
                             .Where(p => !p.Name.EndsWith(".symbols.nupkg"))
                             .ToArray();
                logger.LogNormal("Found {0} packages in {1}", nupkgs.Length, packageDirectory.Value);
                var exitCode = Execute(packageSets, nupkgs, signRequestManifest, excludedRules.Values, logger, ignoreAssistanceMode);
                totalTimeStopWatch.Stop();
                logger.LogNormal("Total took {0}ms", totalTimeStopWatch.ElapsedMilliseconds);

                return(exitCode);
            });

            return(application.Execute(args));
        }