Generates a Implementations.Manifest for a directory.
Inheritance: DirectoryWalkTask
Beispiel #1
0
        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 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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #8
0
        /// <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;
 }
Beispiel #10
0
        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;
        }
        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;
            }
        }