From 1a867d10b974cab4d43d77f5b392f4f07807ebd8 Mon Sep 17 00:00:00 2001 From: Bernard Leach Date: Wed, 20 Apr 2011 07:51:40 +1000 Subject: [PATCH] Added support to IndexDiff to return information on conflicts Change-Id: I43c13eb72a44f80135c93525fce0c0280b0e64a2 Signed-off-by: Chris Aniszczyk --- .../org/eclipse/jgit/lib/IndexDiffTest.java | 46 +++++++++++++++++++ .../src/org/eclipse/jgit/lib/IndexDiff.java | 17 +++++++ 2 files changed, 63 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java index d98358746..80c779ddf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/IndexDiffTest.java @@ -50,11 +50,16 @@ import java.io.File; import java.io.IOException; +import java.util.TreeSet; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.MergeResult; +import org.eclipse.jgit.api.MergeResult.MergeStatus; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.dircache.DirCacheEntry; +import org.eclipse.jgit.merge.MergeStrategy; +import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.treewalk.FileTreeIterator; import org.junit.Test; @@ -139,6 +144,47 @@ public void testModified() throws IOException { assertEquals(0, diff.getMissing().size()); } + @Test + public void testConflicting() throws Exception { + Git git = new Git(db); + + writeTrashFile("a", "1\na\n3\n"); + writeTrashFile("b", "1\nb\n3\n"); + git.add().addFilepattern("a").addFilepattern("b").call(); + RevCommit initialCommit = git.commit().setMessage("initial").call(); + + // create side branch with two modifications + createBranch(initialCommit, "refs/heads/side"); + checkoutBranch("refs/heads/side"); + writeTrashFile("a", "1\na(side)\n3\n"); + writeTrashFile("b", "1\nb\n3\n(side)"); + git.add().addFilepattern("a").addFilepattern("b").call(); + RevCommit secondCommit = git.commit().setMessage("side").call(); + + // update a on master to generate conflict + checkoutBranch("refs/heads/master"); + writeTrashFile("a", "1\na(main)\n3\n"); + git.add().addFilepattern("a").call(); + git.commit().setMessage("main").call(); + + // merge side with master + MergeResult result = git.merge().include(secondCommit.getId()) + .setStrategy(MergeStrategy.RESOLVE).call(); + assertEquals(MergeStatus.CONFLICTING, result.getMergeStatus()); + + FileTreeIterator iterator = new FileTreeIterator(db); + IndexDiff diff = new IndexDiff(db, Constants.HEAD, iterator); + diff.diff(); + + assertEquals("[a, b]", + new TreeSet(diff.getChanged()).toString()); + assertEquals("[a]", diff.getAdded().toString()); + assertEquals("[]", diff.getRemoved().toString()); + assertEquals("[a]", diff.getMissing().toString()); + assertEquals("[a]", diff.getModified().toString()); + assertEquals("[a]", diff.getConflicting().toString()); + } + @Test public void testUnchangedSimple() throws IOException { GitIndex index = new GitIndex(db); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java index 73bda0858..b2c05ae5f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/IndexDiff.java @@ -52,6 +52,7 @@ import java.util.Set; import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -76,6 +77,7 @@ *
  • removed files
  • *
  • missing files
  • *
  • modified files
  • + *
  • conflicting files
  • *
  • untracked files
  • *
  • files with assume-unchanged flag
  • * @@ -153,6 +155,8 @@ public TreeFilter clone() { private Set untracked = new HashSet(); + private Set conflicts = new HashSet(); + private Set assumeUnchanged; private DirCache dirCache; @@ -320,6 +324,12 @@ public boolean diff(final ProgressMonitor monitor, int estWorkTreeSize, modified.add(treeWalk.getPathString()); } } + + final DirCacheEntry dirCacheEntry = dirCacheIterator + .getDirCacheEntry(); + if (dirCacheEntry != null && dirCacheEntry.getStage() > 0) { + conflicts.add(treeWalk.getPathString()); + } } } @@ -377,6 +387,13 @@ public Set getUntracked() { return untracked; } + /** + * @return list of files that are in conflict + */ + public Set getConflicting() { + return conflicts; + } + /** * @return list of files with the flag assume-unchanged */