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); }
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); }
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] }); }