From ddbf67e0588379f2a063cf57b1d3ca926b43e63d Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Fri, 1 Aug 2014 11:28:01 +0200 Subject: [PATCH] IndexDiffFilter should never filter entries with stage!=0 If the IndexDiffFilter is asked whether it should include or filter out a certain path and for that path there is a dircache entry with a stage different from 0, then the filter should never filter out this entry. IndexDiffFilter is an optimized version of AnyDiffFilter and there is no case where the index contains non-0 stages but we still don't see any diff for that path. Change-Id: I25915880f304090fe90584c79bddf021231227a2 Signed-off-by: Matthias Sohn --- .../treewalk/filter/IndexDiffFilterTest.java | 25 +++++++++++++++++++ .../jgit/treewalk/filter/IndexDiffFilter.java | 6 ++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/IndexDiffFilterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/IndexDiffFilterTest.java index c95274f68..bb4b066bf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/IndexDiffFilterTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/IndexDiffFilterTest.java @@ -134,6 +134,31 @@ public class IndexDiffFilterTest extends RepositoryTestCase { assertFalse(treeWalk.next()); } + @Test + public void testConflicts() throws Exception { + RevCommit initial = git.commit().setMessage("initial").call(); + writeTrashFile(FILE, "master"); + git.add().addFilepattern(FILE).call(); + RevCommit master = git.commit().setMessage("master").call(); + git.checkout().setName("refs/heads/side") + .setCreateBranch(true).setStartPoint(initial).call(); + writeTrashFile(FILE, "side"); + git.add().addFilepattern(FILE).call(); + RevCommit side = git.commit().setMessage("side").call(); + assertFalse(git.merge().include("master", master).call() + .getMergeStatus() + .isSuccessful()); + assertEquals(read(FILE), + "<<<<<<< HEAD\nside\n=======\nmaster\n>>>>>>> master\n"); + writeTrashFile(FILE, "master"); + + TreeWalk treeWalk = createTreeWalk(side); + int count = 0; + while (treeWalk.next()) + count++; + assertEquals(2, count); + } + @Test public void testFileInFolderCommitted() throws Exception { RevCommit commit = writeFileInFolderAndCommit(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java index 79cd2193f..5aab24caf 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/filter/IndexDiffFilter.java @@ -139,9 +139,13 @@ public class IndexDiffFilter extends TreeFilter { DirCacheIterator di = tw.getTree(dirCache, DirCacheIterator.class); if (di != null) { DirCacheEntry dce = di.getDirCacheEntry(); - if (dce != null) + if (dce != null) { if (dce.isAssumeValid()) return false; + // Never filter index entries with a stage different from 0 + if (dce.getStage() != 0) + return true; + } } if (!tw.isPostOrderTraversal()) {