Browse Source

DirCacheEditor: Apply PathEdit for each stage

This behavior was defined in the Javadoc of PathEdit, but not actually
implemented.

It's necessary when one wants to use a PathEdit to check out a specific
stage in apply.

Bug: 390147
Change-Id: Iaed5cf60c554fc17e6c4d188caf4f0231da920d0
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
stable-2.2
Robin Stocker 12 years ago committed by Chris Aniszczyk
parent
commit
a2e691351f
  1. 43
      org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java
  2. 13
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java

43
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCachePathEditTest.java vendored

@ -44,6 +44,9 @@ package org.eclipse.jgit.dircache;
import static org.junit.Assert.assertEquals; 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.dircache.DirCacheEditor.PathEdit;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
@ -66,6 +69,19 @@ public class DirCachePathEditTest {
} }
private static final class RecordingEdit extends PathEdit {
final List<DirCacheEntry> entries = new ArrayList<DirCacheEntry>();
public RecordingEdit(String entryPath) {
super(entryPath);
}
@Override
public void apply(DirCacheEntry ent) {
entries.add(ent);
}
}
@Test @Test
public void testAddDeletePathAndTreeNormalNames() { public void testAddDeletePathAndTreeNormalNames() {
DirCache dc = DirCache.newInCore(); DirCache dc = DirCache.newInCore();
@ -114,4 +130,31 @@ public class DirCachePathEditTest {
assertEquals("a.", dc.getEntry(0).getPathString()); assertEquals("a.", dc.getEntry(0).getPathString());
assertEquals("ab", dc.getEntry(1).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<DirCacheEntry> 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;
}
} }

13
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java vendored

@ -146,18 +146,21 @@ public class DirCacheEditor extends BaseDirCacheEditor {
continue; continue;
} }
final DirCacheEntry ent;
if (missing) { if (missing) {
ent = new DirCacheEntry(e.path); final DirCacheEntry ent = new DirCacheEntry(e.path);
e.apply(ent); e.apply(ent);
if (ent.getRawMode() == 0) if (ent.getRawMode() == 0)
throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath throw new IllegalArgumentException(MessageFormat.format(JGitText.get().fileModeNotSetForPath
, ent.getPathString())); , ent.getPathString()));
fastAdd(ent);
} else { } else {
ent = cache.getEntry(eIdx); // Apply to all entries of the current path (different stages)
e.apply(ent); 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; final int cnt = maxIdx - lastIdx;

Loading…
Cancel
Save