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); }
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)); }