public void TestFromPrefix() { Assert.AreSame(ManifestFormat.Sha1, ManifestFormat.FromPrefix("sha1=abc")); Assert.AreSame(ManifestFormat.Sha1New, ManifestFormat.FromPrefix("sha1new=abc")); Assert.AreSame(ManifestFormat.Sha256, ManifestFormat.FromPrefix("sha256=abc")); Assert.AreSame(ManifestFormat.Sha256New, ManifestFormat.FromPrefix("sha256new_abc")); }
private string DeployPackage(string id, PackageBuilder builder) { string path = Path.Combine(_tempDir, id); builder.WritePackageInto(path); ManifestTest.CreateDotFile(path, ManifestFormat.FromPrefix(id), _handler); FileUtils.EnableWriteProtection(path); return(path); }
public static Manifest VerifyDirectory(string directory, ManifestDigest expectedDigest, ITaskHandler handler) { #region Sanity checks if (string.IsNullOrEmpty(directory)) { throw new ArgumentNullException("directory"); } if (handler == null) { throw new ArgumentNullException("handler"); } #endregion string expectedDigestValue = expectedDigest.Best; if (string.IsNullOrEmpty(expectedDigestValue)) { throw new NotSupportedException(Resources.NoKnownDigestMethod); } var format = ManifestFormat.FromPrefix(expectedDigestValue); var generator = new ManifestGenerator(directory, format) { Tag = expectedDigest }; handler.RunTask(generator); var actualManifest = generator.Result; string actualDigestValue = actualManifest.CalculateDigest(); string manifestFilePath = Path.Combine(directory, Manifest.ManifestFile); var expectedManifest = File.Exists(manifestFilePath) ? Manifest.Load(manifestFilePath, format) : null; if (actualDigestValue != expectedDigestValue) { throw new DigestMismatchException( expectedDigestValue, actualDigestValue, // Only log the complete manifests in verbose mode (handler.Verbosity > 0) ? expectedManifest : null, (handler.Verbosity > 0) ? actualManifest : null); } return(actualManifest); }
public static Manifest VerifyDirectory(string directory, ManifestDigest expectedDigest, ITaskHandler handler) { #region Sanity checks if (string.IsNullOrEmpty(directory)) { throw new ArgumentNullException(nameof(directory)); } if (handler == null) { throw new ArgumentNullException(nameof(handler)); } #endregion string?expectedDigestValue = expectedDigest.Best; if (string.IsNullOrEmpty(expectedDigestValue)) { throw new NotSupportedException(Resources.NoKnownDigestMethod); } var format = ManifestFormat.FromPrefix(expectedDigestValue); var generator = new ManifestGenerator(directory, format) { Tag = expectedDigest }; handler.RunTask(generator); var manifest = generator.Manifest; string digest = manifest.CalculateDigest(); if (digest != expectedDigestValue) { var offsetManifest = TryFindOffset(manifest, expectedDigestValue); if (offsetManifest != null) { return(offsetManifest); } string manifestFilePath = Path.Combine(directory, Manifest.ManifestFile); var expectedManifest = File.Exists(manifestFilePath) ? Manifest.Load(manifestFilePath, format) : null; throw new DigestMismatchException(expectedDigestValue, digest, expectedManifest, manifest); } return(manifest); }
/// <summary> /// Executes the work-step for a single implementation. /// </summary> public void Work(ManifestDigest manifestDigest) { string digestString = manifestDigest.Best; if (digestString == null) { return; } string implementationPath = Path.Combine(_storePath, digestString); var manifest = Manifest.Load(Path.Combine(implementationPath, Manifest.ManifestFile), ManifestFormat.FromPrefix(digestString)); string currentDirectory = ""; new AggregateDispatcher <ManifestNode> { (ManifestDirectory x) => { currentDirectory = FileUtils.UnifySlashes(x.FullPath.TrimStart('/')); }, (ManifestFileBase x) => { if (x.Size == 0) { return; } var key = new DedupKey(x.Size, x.ModifiedTime, manifest.Format, x.Digest); var file = new StoreFile(implementationPath, Path.Combine(currentDirectory, x.Name)); StoreFile existingFile; if (_fileHashes.TryGetValue(key, out existingFile)) { if (!FileUtils.AreHardlinked(file, existingFile)) { if (JoinWithHardlink(file, existingFile)) { SavedBytes += x.Size; } } } else { _fileHashes.Add(key, file); } } }.Dispatch(manifest); }
/// <summary> /// Executes the work-step for a single implementation. /// </summary> public void Work(ManifestDigest manifestDigest) { string?digestString = manifestDigest.Best; if (digestString == null) { return; } string implementationPath = Path.Combine(_storePath, digestString); var manifest = Manifest.Load(Path.Combine(implementationPath, Manifest.ManifestFile), ManifestFormat.FromPrefix(digestString)); string currentDirectory = ""; foreach (var node in manifest) { switch (node) { case ManifestDirectory x: currentDirectory = FileUtils.UnifySlashes(x.FullPath.TrimStart('/')); break; case ManifestFileBase x: if (x.Size == 0) { return; } var key = new DedupKey(x.Size, x.ModifiedTime, manifest.Format, x.Digest); var file = new StoreFile(implementationPath, Path.Combine(currentDirectory, x.Name)); if (_fileHashes.TryGetValue(key, out var existingFile)) { if (!FileUtils.AreHardlinked(file, existingFile)) { if (JoinWithHardlink(file, existingFile)) { SavedBytes += x.Size; } } } else { _fileHashes.Add(key, file); } break; } } }
public void TestFromPrefix() { ManifestFormat.FromPrefix("sha1new=abc").Should().BeSameAs(ManifestFormat.Sha1New); ManifestFormat.FromPrefix("sha256=abc").Should().BeSameAs(ManifestFormat.Sha256); ManifestFormat.FromPrefix("sha256new_abc").Should().BeSameAs(ManifestFormat.Sha256New); }