private static Manifest GenerateManifest(string path, ManifestFormat format, ITaskHandler handler) { var generator = new ManifestGenerator(path, format); handler.RunTask(generator); return(generator.Manifest); }
/// <summary> /// Generates a manifest for a directory in the filesystem and writes the manifest to a file named Manifest.ManifestFile in that directory. /// </summary> /// <param name="path">The path of the directory to analyze.</param> /// <param name="format">The format of the manifest (which file details are listed, which digest method is used, etc.).</param> /// <param name="handler">A callback object used when the the user is to be informed about progress.</param> /// <returns>The manifest digest.</returns> /// <exception cref="IOException">A problem occurs while writing the file.</exception> /// <remarks> /// The exact format is specified here: http://0install.net/manifest-spec.html /// </remarks> public static string CreateDotFile([NotNull] string path, [NotNull] ManifestFormat format, [NotNull] ITaskHandler handler) { #region Sanity checks if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); if (format == null) throw new ArgumentNullException("format"); if (handler == null) throw new ArgumentNullException("handler"); #endregion var generator = new ManifestGenerator(path, format); handler.RunTask(generator); return generator.Result.Save(Path.Combine(path, Manifest.ManifestFile)); }
public void SetUp() { var packageBuilder = new PackageBuilder() .AddFolder("someFolder") .AddFolder("someOtherFolder") .AddFile("nestedFile1", "abc") .AddFile("nestedFile2", "123"); _sandbox = new TemporaryDirectory("0install-unit-tests"); packageBuilder.WritePackageInto(_sandbox); _someGenerator = new ManifestGenerator(_sandbox, ManifestFormat.Sha256); }
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); }
public void ShouldHandleRelativePaths() { // Change the working directory string oldWorkingDir = Environment.CurrentDirectory; Environment.CurrentDirectory = _sandbox; try { // Replace default generator with one using a relative path _someGenerator = new ManifestGenerator(".", ManifestFormat.Sha256); ShouldGenerateManifestWithAllFilesListed(); } finally { // Restore the original working directory Environment.CurrentDirectory = oldWorkingDir; } }
/// <summary> /// Generates a manifest for a directory in the filesystem and writes the manifest to a file named Manifest.ManifestFile in that directory. /// </summary> /// <param name="path">The path of the directory to analyze.</param> /// <param name="format">The format of the manifest (which file details are listed, which digest method is used, etc.).</param> /// <param name="handler">A callback object used when the the user is to be informed about progress.</param> /// <returns>The manifest digest.</returns> /// <exception cref="IOException">A problem occurs while writing the file.</exception> /// <remarks> /// The exact format is specified here: http://0install.net/manifest-spec.html /// </remarks> public static string CreateDotFile([NotNull] string path, [NotNull] ManifestFormat format, [NotNull] ITaskHandler handler) { #region Sanity checks if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException(nameof(path)); } if (format == null) { throw new ArgumentNullException(nameof(format)); } if (handler == null) { throw new ArgumentNullException(nameof(handler)); } #endregion var generator = new ManifestGenerator(path, format); handler.RunTask(generator); return(generator.Manifest.Save(Path.Combine(path, Manifest.ManifestFile))); }
private static Manifest GenerateManifest(string path, ManifestFormat format, ITaskHandler handler) { var generator = new ManifestGenerator(path, format); handler.RunTask(generator); return generator.Result; }
private Manifest GenerateManifest(string path, string subdir) { if (Directory.Exists(path)) { if (!string.IsNullOrEmpty(subdir)) throw new OptionException(Resources.TooManyArguments + Environment.NewLine + subdir.EscapeArgument(), null); var generator = new ManifestGenerator(path, _algorithm); Handler.RunTask(generator); return generator.Result; } else if (File.Exists(path)) { using (var tempDir = new TemporaryDirectory("0install")) { using (var extractor = Extractor.FromFile(path, tempDir)) { extractor.SubDir = subdir; Handler.RunTask(extractor); } var generator = new ManifestGenerator(tempDir, _algorithm); Handler.RunTask(generator); return generator.Result; } } else throw new FileNotFoundException(string.Format(Resources.FileOrDirNotFound, path)); }
public static ManifestDigest GenerateDigest([NotNull] string path, [NotNull] ITaskHandler handler, [CanBeNull] IStore keepDownloads = null) { #region Sanity checks if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path)); if (handler == null) throw new ArgumentNullException(nameof(handler)); #endregion var digest = new ManifestDigest(); // Generate manifest for each available format... foreach (var format in ManifestFormat.All) // ... and add the resulting digest to the return value { var generator = new ManifestGenerator(path, format); handler.RunTask(generator); digest.ParseID(generator.Manifest.CalculateDigest()); } if (digest.PartialEquals(ManifestDigest.Empty)) Log.Warn(Resources.EmptyImplementation); if (keepDownloads != null) { try { keepDownloads.AddDirectory(path, digest, handler); } catch (ImplementationAlreadyInStoreException) {} } return digest; }