public override bool Execute() { DateTime startTime = DateTime.Now; ConflictingPackageInfos = SourceBuiltPackageInfos .Where(item => { string sourceBuiltPath = item.ItemSpec; string id = item.GetMetadata("PackageId"); string version = item.GetMetadata("PackageVersion"); string packageCachePath = Path.Combine( PackageCacheDir, id.ToLowerInvariant(), version, $"{id.ToLowerInvariant()}.{version}.nupkg"); if (!File.Exists(packageCachePath)) { Log.LogMessage( MessageImportance.Low, $"OK: Package not found in package cache: {id} {version}"); return(false); } Log.LogMessage( MessageImportance.Low, $"Package id/version found in package cache, verifying: {id} {version}"); bool identical = File.ReadAllBytes(sourceBuiltPath) .SequenceEqual(File.ReadAllBytes(packageCachePath)); if (!identical) { Log.LogMessage( MessageImportance.Low, "BAD: Source-built nupkg is not byte-for-byte identical " + $"to nupkg in cache: {id} {version}"); return(true); } Log.LogMessage( MessageImportance.Low, $"OK: Package in cache is identical to source-built: {id} {version}"); return(false); }) .ToArray(); // Tell the user about this task, in case it takes a while. Log.LogMessage( MessageImportance.High, "Checked cache for conflicts with source-built nupkgs. " + $"Took {DateTime.Now - startTime}"); return(!Log.HasLoggedErrors); }
public override bool Execute() { DateTime startTime = DateTime.Now; var knownNupkgs = new Lazy <ILookup <PackageIdentity, string> >(() => { Log.LogMessage( MessageImportance.Low, $"Reading all {nameof(KnownOriginPackagePaths)} package identities to search " + "for conflicting package origin..."); return(KnownOriginPackagePaths.NullAsEmpty().ToLookup( ReadNuGetPackageInfos.ReadIdentity, path => path)); }); ConflictingPackageInfos = SourceBuiltPackageInfos .Where(item => { string sourceBuiltPath = item.ItemSpec; string id = item.GetMetadata("PackageId"); string version = item.GetMetadata("PackageVersion"); string packageCachePath = Path.Combine( PackageCacheDir, id.ToLowerInvariant(), version, $"{id.ToLowerInvariant()}.{version}.nupkg"); if (!File.Exists(packageCachePath)) { Log.LogMessage( MessageImportance.Low, $"OK: Package not found in package cache: {id} {version}"); return(false); } Log.LogMessage( MessageImportance.Low, $"Package id/version found in package cache, verifying: {id} {version}"); byte[] packageCacheBytes = File.ReadAllBytes(packageCachePath); if (packageCacheBytes.SequenceEqual(File.ReadAllBytes(sourceBuiltPath))) { Log.LogMessage( MessageImportance.Low, $"OK: Package in cache is identical to source-built: {id} {version}"); return(false); } Log.LogMessage( MessageImportance.Low, "BAD: Source-built nupkg is not byte-for-byte identical " + $"to nupkg in cache: {id} {version}"); var ident = new PackageIdentity(id, NuGetVersion.Parse(version)); string message = null; foreach (string knownNupkg in knownNupkgs.Value[ident]) { if (packageCacheBytes.SequenceEqual(File.ReadAllBytes(knownNupkg))) { Log.LogMessage( MessageImportance.Low, $"Found identity match with identical contents: {knownNupkg}"); message = (message ?? "Nupkg found at") + $" '{knownNupkg}'"; } else { Log.LogMessage( MessageImportance.Low, $"Package identity match, but contents differ: {knownNupkg}"); } } item.SetMetadata( "WarningMessage", message ?? "Origin nupkg not found in build directory. It may have been " + "downloaded by NuGet restore."); return(true); }) .ToArray(); // Tell the user about this task, in case it takes a while. Log.LogMessage( MessageImportance.High, "Checked cache for conflicts with source-built nupkgs. " + $"Took {DateTime.Now - startTime}"); return(!Log.HasLoggedErrors); }