예제 #1
0
파일: Program.cs 프로젝트: kvd-vcs/skvd
        private static DifferenceEntries DiffTrees(TreeNode leftTree, TreeNode rightTree)
        {
            var flatTreeCreator    = new FlatTreeCreator();
            var differ             = new FlatTreeDiffer();
            var diffEntriesCreator = new DifferenceEntriesCreator(flatTreeCreator, differ);

            var result = diffEntriesCreator.Create(leftTree, rightTree);

            return(result);
        }
예제 #2
0
파일: Program.cs 프로젝트: kvd-vcs/skvd
        private static async Task <IDictionary <string, string> > HashModifications(string[] args)
        {
            var hashComputer = new HashTableCreator(new FileSystem(), () => new SHA1Managed());

            var(leftTree, rightTree) = await GetTrees(args);

            var diff             = DiffTrees(leftTree, rightTree);
            var rightFlat        = new FlatTreeCreator().Create(rightTree);
            var forHashFlatItems = rightFlat.Where(i => diff.Modified.Contains(i.Name) || diff.Added.Contains(i.Name));
            var hashes           = hashComputer.Compute(forHashFlatItems, Environment.CurrentDirectory);

            return(hashes);
        }
예제 #3
0
파일: Program.cs 프로젝트: kvd-vcs/skvd
        private static async Task Checkout(string[] args)
        {
            var targetCommit = await ReadFromStorage <CommitModel>(args[0], CommitsStorage);

            var currentTree = await CreateTreeFiltered(Environment.CurrentDirectory);

            var targetTree = await ReadFromStorage <TreeNode>(targetCommit.TreeHash, TreesStorage);

            var diff = DiffTrees(currentTree, targetTree);

            foreach (var removed in diff.Removed)
            {
                if (!File.Exists(removed))
                {
                    continue;
                }

                File.Delete(removed);
                Console.WriteLine($" - {removed}");
            }

            var targetHashes = await GetHashesForCommit(targetCommit);

            var treeFlatter    = new FlatTreeCreator();
            var flatTargetTree = treeFlatter.Create(targetTree);

            foreach (var adding in diff.Added.Where(a => targetHashes.ContainsKey(a)))
            {
                using (var addStream = File.Create(adding))
                {
                    var source = BlobsStorage.Get(targetHashes[adding]);
                    await source.CopyToAsync(addStream);

                    await addStream.FlushAsync();

                    addStream.Close();

                    File.SetLastWriteTimeUtc(adding, ((TreeNodeFile)flatTargetTree.First(t => t.Name == adding).Node).ModificationTime);

                    Console.WriteLine($" + {adding}");
                }
            }

            foreach (var modified in diff.Modified.Where(a => targetHashes.ContainsKey(a)))
            {
                using (var modifyStream = File.Open(modified, FileMode.Truncate, FileAccess.Write, FileShare.Write))
                {
                    var source = BlobsStorage.Get(targetHashes[modified]);
                    await source.CopyToAsync(modifyStream);

                    await modifyStream.FlushAsync();

                    modifyStream.Close();

                    File.SetLastWriteTimeUtc(modified, ((TreeNodeFile)flatTargetTree.First(t => t.Name == modified).Node).ModificationTime);

                    Console.WriteLine($" * {modified}");
                }
            }

            WriteHead(new [] { args[0] });
        }