reftable: pass on invalid object ID in conversion
Before, while trying to determine if an object ID was a tag or not, the reftable conversion would yield an exception. Change-Id: I3688a0ffa9e774ba27f320e3840ff8cada21ecf0
This commit is contained in:
parent
9c3190ce7a
commit
b4782d74fd
|
@ -58,7 +58,9 @@
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -162,20 +164,21 @@ public void testConvert() throws Exception {
|
||||||
assertTrue(db.getRefDatabase().hasFastTipsWithSha1());
|
assertTrue(db.getRefDatabase().hasFastTipsWithSha1());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConvertToRefdir() throws Exception {
|
public void testConvertBrokenObjectId() throws Exception {
|
||||||
db.convertToPackedRefs(false, false);
|
db.convertToPackedRefs(false, false);
|
||||||
assertTrue(db.getRefDatabase() instanceof RefDirectory);
|
new File(db.getDirectory(), "refs/heads").mkdirs();
|
||||||
Ref h = db.exactRef("HEAD");
|
|
||||||
assertTrue(h.isSymbolic());
|
|
||||||
assertEquals("refs/heads/master", h.getTarget().getName());
|
|
||||||
|
|
||||||
Ref b = db.exactRef("refs/heads/b");
|
String invalidId = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
|
||||||
assertFalse(b.isSymbolic());
|
File headFile = new File(db.getDirectory(), "refs/heads/broken");
|
||||||
assertTrue(b.isPeeled());
|
try (OutputStream os = new FileOutputStream(headFile)) {
|
||||||
assertEquals(bCommit, b.getObjectId().name());
|
os.write(Constants.encodeASCII(invalidId + "\n"));
|
||||||
|
}
|
||||||
|
|
||||||
assertFalse(db.getRefDatabase().hasFastTipsWithSha1());
|
Ref r = db.exactRef("refs/heads/broken");
|
||||||
|
assertNotNull(r);
|
||||||
|
db.convertToReftable(true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.eclipse.jgit.annotations.NonNull;
|
import org.eclipse.jgit.annotations.NonNull;
|
||||||
|
import org.eclipse.jgit.errors.MissingObjectException;
|
||||||
import org.eclipse.jgit.events.RefsChangedEvent;
|
import org.eclipse.jgit.events.RefsChangedEvent;
|
||||||
import org.eclipse.jgit.internal.storage.reftable.MergedReftable;
|
import org.eclipse.jgit.internal.storage.reftable.MergedReftable;
|
||||||
import org.eclipse.jgit.internal.storage.reftable.ReftableBatchRefUpdate;
|
import org.eclipse.jgit.internal.storage.reftable.ReftableBatchRefUpdate;
|
||||||
|
@ -615,15 +616,20 @@ private static Ref refForWrite(RevWalk rw, Ref r) throws IOException {
|
||||||
r.getTarget().getName(), null));
|
r.getTarget().getName(), null));
|
||||||
}
|
}
|
||||||
ObjectId newId = r.getObjectId();
|
ObjectId newId = r.getObjectId();
|
||||||
RevObject obj = rw.parseAny(newId);
|
|
||||||
RevObject peel = null;
|
RevObject peel = null;
|
||||||
if (obj instanceof RevTag) {
|
try {
|
||||||
peel = rw.peel(obj);
|
RevObject obj = rw.parseAny(newId);
|
||||||
|
if (obj instanceof RevTag) {
|
||||||
|
peel = rw.peel(obj);
|
||||||
|
}
|
||||||
|
} catch (MissingObjectException e) {
|
||||||
|
/* ignore this error and copy the dangling object ID into reftable too. */
|
||||||
}
|
}
|
||||||
if (peel != null) {
|
if (peel != null) {
|
||||||
return new ObjectIdRef.PeeledTag(PACKED, r.getName(), newId,
|
return new ObjectIdRef.PeeledTag(PACKED, r.getName(), newId,
|
||||||
peel.copy());
|
peel.copy());
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ObjectIdRef.PeeledNonTag(PACKED, r.getName(), newId);
|
return new ObjectIdRef.PeeledNonTag(PACKED, r.getName(), newId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue