|
|
|
@ -9,6 +9,7 @@ import static org.eclipse.jgit.internal.storage.pack.PackExt.REFTABLE;
|
|
|
|
|
import static org.junit.Assert.assertEquals; |
|
|
|
|
import static org.junit.Assert.assertFalse; |
|
|
|
|
import static org.junit.Assert.assertNotNull; |
|
|
|
|
import static org.junit.Assert.assertNull; |
|
|
|
|
import static org.junit.Assert.assertSame; |
|
|
|
|
import static org.junit.Assert.assertTrue; |
|
|
|
|
import static org.junit.Assert.fail; |
|
|
|
@ -18,6 +19,7 @@ import java.util.Collections;
|
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
|
|
import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource; |
|
|
|
|
import org.eclipse.jgit.internal.storage.dfs.DfsRefDatabase; |
|
|
|
|
import org.eclipse.jgit.internal.storage.reftable.RefCursor; |
|
|
|
|
import org.eclipse.jgit.internal.storage.reftable.ReftableConfig; |
|
|
|
|
import org.eclipse.jgit.internal.storage.reftable.ReftableReader; |
|
|
|
@ -842,6 +844,106 @@ public class DfsGarbageCollectorTest {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void reftableWithoutTombstoneResurrected() throws Exception { |
|
|
|
|
RevCommit commit0 = commit().message("0").create(); |
|
|
|
|
String NEXT = "refs/heads/next"; |
|
|
|
|
DfsRefDatabase refdb = (DfsRefDatabase)repo.getRefDatabase(); |
|
|
|
|
git.update(NEXT, commit0); |
|
|
|
|
Ref next = refdb.exactRef(NEXT); |
|
|
|
|
assertNotNull(next); |
|
|
|
|
assertEquals(commit0, next.getObjectId()); |
|
|
|
|
|
|
|
|
|
git.delete(NEXT); |
|
|
|
|
refdb.clearCache(); |
|
|
|
|
assertNull(refdb.exactRef(NEXT)); |
|
|
|
|
|
|
|
|
|
DfsGarbageCollector gc = new DfsGarbageCollector(repo); |
|
|
|
|
gc.setReftableConfig(new ReftableConfig()); |
|
|
|
|
gc.setIncludeDeletes(false); |
|
|
|
|
gc.setConvertToReftable(false); |
|
|
|
|
run(gc); |
|
|
|
|
assertEquals(1, odb.getReftables().length); |
|
|
|
|
try (DfsReader ctx = odb.newReader(); |
|
|
|
|
ReftableReader rr = odb.getReftables()[0].open(ctx)) { |
|
|
|
|
rr.setIncludeDeletes(true); |
|
|
|
|
assertEquals(1, rr.minUpdateIndex()); |
|
|
|
|
assertEquals(2, rr.maxUpdateIndex()); |
|
|
|
|
assertNull(rr.exactRef(NEXT)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RevCommit commit1 = commit().message("1").create(); |
|
|
|
|
DfsPackDescription t1 = odb.newPack(INSERT); |
|
|
|
|
Ref newNext = new ObjectIdRef.PeeledNonTag(Ref.Storage.LOOSE, NEXT, |
|
|
|
|
commit1); |
|
|
|
|
try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) { |
|
|
|
|
ReftableWriter w = new ReftableWriter(); |
|
|
|
|
w.setMinUpdateIndex(1); |
|
|
|
|
w.setMaxUpdateIndex(1); |
|
|
|
|
w.begin(out); |
|
|
|
|
w.writeRef(newNext, 1); |
|
|
|
|
w.finish(); |
|
|
|
|
t1.addFileExt(REFTABLE); |
|
|
|
|
t1.setReftableStats(w.getStats()); |
|
|
|
|
} |
|
|
|
|
odb.commitPack(Collections.singleton(t1), null); |
|
|
|
|
assertEquals(2, odb.getReftables().length); |
|
|
|
|
refdb.clearCache(); |
|
|
|
|
newNext = refdb.exactRef(NEXT); |
|
|
|
|
assertNotNull(newNext); |
|
|
|
|
assertEquals(commit1, newNext.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void reftableWithTombstoneNotResurrected() throws Exception { |
|
|
|
|
RevCommit commit0 = commit().message("0").create(); |
|
|
|
|
String NEXT = "refs/heads/next"; |
|
|
|
|
DfsRefDatabase refdb = (DfsRefDatabase)repo.getRefDatabase(); |
|
|
|
|
git.update(NEXT, commit0); |
|
|
|
|
Ref next = refdb.exactRef(NEXT); |
|
|
|
|
assertNotNull(next); |
|
|
|
|
assertEquals(commit0, next.getObjectId()); |
|
|
|
|
|
|
|
|
|
git.delete(NEXT); |
|
|
|
|
refdb.clearCache(); |
|
|
|
|
assertNull(refdb.exactRef(NEXT)); |
|
|
|
|
|
|
|
|
|
DfsGarbageCollector gc = new DfsGarbageCollector(repo); |
|
|
|
|
gc.setReftableConfig(new ReftableConfig()); |
|
|
|
|
gc.setIncludeDeletes(true); |
|
|
|
|
gc.setConvertToReftable(false); |
|
|
|
|
run(gc); |
|
|
|
|
assertEquals(1, odb.getReftables().length); |
|
|
|
|
try (DfsReader ctx = odb.newReader(); |
|
|
|
|
ReftableReader rr = odb.getReftables()[0].open(ctx)) { |
|
|
|
|
rr.setIncludeDeletes(true); |
|
|
|
|
assertEquals(1, rr.minUpdateIndex()); |
|
|
|
|
assertEquals(2, rr.maxUpdateIndex()); |
|
|
|
|
next = rr.exactRef(NEXT); |
|
|
|
|
assertNotNull(next); |
|
|
|
|
assertNull(next.getObjectId()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RevCommit commit1 = commit().message("1").create(); |
|
|
|
|
DfsPackDescription t1 = odb.newPack(INSERT); |
|
|
|
|
Ref newNext = new ObjectIdRef.PeeledNonTag(Ref.Storage.LOOSE, NEXT, |
|
|
|
|
commit1); |
|
|
|
|
try (DfsOutputStream out = odb.writeFile(t1, REFTABLE)) { |
|
|
|
|
ReftableWriter w = new ReftableWriter(); |
|
|
|
|
w.setMinUpdateIndex(1); |
|
|
|
|
w.setMaxUpdateIndex(1); |
|
|
|
|
w.begin(out); |
|
|
|
|
w.writeRef(newNext, 1); |
|
|
|
|
w.finish(); |
|
|
|
|
t1.addFileExt(REFTABLE); |
|
|
|
|
t1.setReftableStats(w.getStats()); |
|
|
|
|
} |
|
|
|
|
odb.commitPack(Collections.singleton(t1), null); |
|
|
|
|
assertEquals(2, odb.getReftables().length); |
|
|
|
|
refdb.clearCache(); |
|
|
|
|
assertNull(refdb.exactRef(NEXT)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private TestRepository<InMemoryRepository>.CommitBuilder commit() { |
|
|
|
|
return git.commit(); |
|
|
|
|
} |
|
|
|
|