summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GCTest.java26
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java4
2 files changed, 24 insertions, 6 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GCTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GCTest.java
index 8f26f7058d..bc60f64886 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GCTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GCTest.java
@@ -49,8 +49,8 @@ import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.File;
-import java.util.Collection;
import java.io.IOException;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
@@ -62,6 +62,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.internal.storage.file.GC;
@@ -76,9 +77,9 @@ import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.junit.TestRepository.BranchBuilder;
-import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.junit.TestRepository.CommitBuilder;
import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.EmptyProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref.Storage;
@@ -437,6 +438,20 @@ public class GCTest extends LocalDiskRepositoryTestCase {
}
@Test
+ public void testPackRepoWithCorruptReflog() throws Exception {
+ // create a reflog entry "0000... 0000... foobar" by doing an initial
+ // refupdate for HEAD which points to a non-existing ref. The
+ // All-Projects repo of gerrit instances had such entries
+ RefUpdate ru = repo.updateRef(Constants.HEAD);
+ ru.link("refs/to/garbage");
+ tr.branch("refs/heads/master").commit().add("A", "A").add("B", "B")
+ .create();
+ // make sure HEAD exists
+ Git.wrap(repo).checkout().setName("refs/heads/master").call();
+ gc.gc();
+ }
+
+ @Test
public void testKeepFiles() throws Exception {
BranchBuilder bb = tr.branch("refs/heads/master");
bb.commit().add("A", "A").add("B", "B").create();
@@ -477,9 +492,10 @@ public class GCTest extends LocalDiskRepositoryTestCase {
assertEquals(4, ind2.getObjectCount());
for (MutableEntry e: ind1)
if (ind2.hasObject(e.toObjectId()))
- assertFalse(
- "the following object is in both packfiles: "
- + e.toObjectId(), ind2.hasObject(e.toObjectId()));
+ assertFalse(
+ "the following object is in both packfiles: "
+ + e.toObjectId(),
+ ind2.hasObject(e.toObjectId()));
}
@Test
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
index 67bb664b5b..22fa827044 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java
@@ -555,7 +555,9 @@ public class GC {
for (ReflogEntry e : rlEntries) {
if (e.getWho().getWhen().getTime() < minTime)
break;
- ret.add(e.getNewId());
+ ObjectId newId = e.getNewId();
+ if (newId != null && !ObjectId.zeroId().equals(newId))
+ ret.add(newId);
ObjectId oldId = e.getOldId();
if (oldId != null && !ObjectId.zeroId().equals(oldId))
ret.add(oldId);