diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java index 4a6a42b6d..28140f330 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java @@ -44,6 +44,9 @@ import static org.junit.Assert.assertEquals; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; @@ -66,6 +69,19 @@ public void apply(DirCacheEntry ent) { } + private static final class RecordingEdit extends PathEdit { + final List entries = new ArrayList(); + + public RecordingEdit(String entryPath) { + super(entryPath); + } + + @Override + public void apply(DirCacheEntry ent) { + entries.add(ent); + } + } + @Test public void testAddDeletePathAndTreeNormalNames() { DirCache dc = DirCache.newInCore(); @@ -114,4 +130,31 @@ public void testAddDeleteTrickyNames() { assertEquals("a.", dc.getEntry(0).getPathString()); assertEquals("ab", dc.getEntry(1).getPathString()); } + + @Test + public void testPathEditShouldBeCalledForEachStage() throws Exception { + DirCache dc = DirCache.newInCore(); + DirCacheBuilder builder = new DirCacheBuilder(dc, 3); + builder.add(createEntry("a", DirCacheEntry.STAGE_1)); + builder.add(createEntry("a", DirCacheEntry.STAGE_2)); + builder.add(createEntry("a", DirCacheEntry.STAGE_3)); + builder.finish(); + + DirCacheEditor editor = dc.editor(); + RecordingEdit recorder = new RecordingEdit("a"); + editor.add(recorder); + editor.finish(); + + List entries = recorder.entries; + assertEquals(3, entries.size()); + assertEquals(DirCacheEntry.STAGE_1, entries.get(0).getStage()); + assertEquals(DirCacheEntry.STAGE_2, entries.get(1).getStage()); + assertEquals(DirCacheEntry.STAGE_3, entries.get(2).getStage()); + } + + private static DirCacheEntry createEntry(String path, int stage) { + DirCacheEntry entry = new DirCacheEntry(path, stage); + entry.setFileMode(FileMode.REGULAR_FILE); + return entry; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java index 6c12c402b..b0cb34c35 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java @@ -146,18 +146,21 @@ private void applyEdits() { continue; } - final DirCacheEntry ent; if (missing) { - ent = new DirCacheEntry(e.path); + final DirCacheEntry ent = new DirCacheEntry(e.path); e.apply(ent); if (ent.getRawMode() == 0) throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath , ent.getPathString())); + fastAdd(ent); } else { - ent = cache.getEntry(eIdx); - e.apply(ent); + // Apply to all entries of the current path (different stages) + for (int i = eIdx; i < lastIdx; i++) { + final DirCacheEntry ent = cache.getEntry(i); + e.apply(ent); + fastAdd(ent); + } } - fastAdd(ent); } final int cnt = maxIdx - lastIdx;