/// <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;
                    }
                }
            }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }