Created
October 10, 2009 22:58
-
-
Save jagregory/207221 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class DiffTrees | |
| { | |
| private IList<Tree> trees = new List<Tree>(); | |
| public bool Recursive { get; set; } | |
| public void AddTree(Tree tree) | |
| { | |
| trees.Add(tree); | |
| } | |
| public IList<ChangeEntry> Diff() | |
| { | |
| if (trees.Count == 0) | |
| return new List<ChangeEntry>(); | |
| var changes = new List<ChangeEntry>(); | |
| var repos = trees.First().Repository; | |
| var walk = new TreeWalk(repos); | |
| walk.reset(); | |
| walk.Recursive = Recursive; | |
| walk.setFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, TreeFilter.ALL)); | |
| foreach (var tree in trees) | |
| walk.addTree(new CanonicalTreeParser(null, repos, tree.Id, new WindowCursor())); | |
| var numberOfTrees = walk.getTreeCount(); | |
| while (walk.next()) | |
| { | |
| var revisions = new List<RevisionDetails>(); | |
| var path = walk.getPathString(); | |
| var changeType = ChangeType.Modified; | |
| // create revision for each tree | |
| for (var i = 0; i < numberOfTrees; i++) | |
| revisions.Add(new RevisionDetails(walk.getFileMode(i), walk.getObjectId(i))); | |
| // TODO: Remove this hack - should support more than 2 trees | |
| if (numberOfTrees == 2) | |
| { | |
| // calculate change type (if not modified) | |
| var firstMode = walk.getRawMode(0); | |
| var secondMode = walk.getRawMode(1); | |
| if (firstMode == 0 && secondMode != 0) | |
| changeType = ChangeType.Added; | |
| else if (firstMode != 0 && secondMode == 0) | |
| changeType = ChangeType.Deleted; | |
| else if (firstMode != secondMode && walk.idEqual(0, 1)) | |
| changeType = ChangeType.ChangeOfType; | |
| } | |
| changes.Add(new ChangeEntry(path, changeType, revisions)); | |
| } | |
| return changes; | |
| } | |
| public void OutputToConsole() | |
| { | |
| foreach (var change in Diff()) | |
| { | |
| Console.Write(":"); | |
| foreach (var rev in change.Revisions) | |
| { | |
| Console.Write(rev.FileMode.ToString().PadLeft(6, '0')); | |
| Console.Write(" "); | |
| } | |
| foreach (var rev in change.Revisions) | |
| { | |
| Console.Write(rev.Id); | |
| Console.Write(" "); | |
| } | |
| Console.Write(change.Type); | |
| Console.Write(" "); | |
| Console.WriteLine(change.Name); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment