Skip to content

Instantly share code, notes, and snippets.

@jagregory
Created October 10, 2009 22:58
Show Gist options
  • Select an option

  • Save jagregory/207221 to your computer and use it in GitHub Desktop.

Select an option

Save jagregory/207221 to your computer and use it in GitHub Desktop.
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