diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/AbbreviationTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/AbbreviationTest.java index 96e36a2a6..1a38a7deb 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/AbbreviationTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/AbbreviationTest.java @@ -56,6 +56,7 @@ import java.util.Collection; import java.util.List; +import org.eclipse.jgit.errors.AmbiguousObjectException; import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase; import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.lib.AbbreviatedObjectId; @@ -176,13 +177,25 @@ public void testAbbreviateIsActuallyUnique() throws Exception { assertEquals(id.abbreviate(20), reader.abbreviate(id, 2)); - Collection matches = reader.resolve(id.abbreviate(8)); + AbbreviatedObjectId abbrev8 = id.abbreviate(8); + Collection matches = reader.resolve(abbrev8); assertNotNull(matches); assertEquals(objects.size(), matches.size()); for (PackedObjectInfo info : objects) assertTrue("contains " + info.name(), matches.contains(info)); - assertNull("cannot resolve", db.resolve(id.abbreviate(8).name())); + try { + db.resolve(abbrev8.name()); + fail("did not throw AmbiguousObjectException"); + } catch (AmbiguousObjectException err) { + assertEquals(abbrev8, err.getAbbreviatedObjectId()); + matches = err.getCandidates(); + assertNotNull(matches); + assertEquals(objects.size(), matches.size()); + for (PackedObjectInfo info : objects) + assertTrue("contains " + info.name(), matches.contains(info)); + } + assertEquals(id, db.resolve(id.abbreviate(20).name())); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java index b62f62b34..078b293f4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java @@ -63,6 +63,7 @@ import org.eclipse.jgit.JGitText; import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.errors.AmbiguousObjectException; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; @@ -393,10 +394,15 @@ public RefRename renameRef(final String fromRef, final String toRef) throws IOEx * @param revstr * A git object references expression * @return an ObjectId or null if revstr can't be resolved to any ObjectId + * @throws AmbiguousObjectException + * {@code revstr} contains an abbreviated ObjectId and this + * repository contains more than one object which match to the + * input abbreviation. * @throws IOException * on serious errors */ - public ObjectId resolve(final String revstr) throws IOException { + public ObjectId resolve(final String revstr) + throws AmbiguousObjectException, IOException { RevWalk rw = new RevWalk(this); try { return resolve(rw, revstr); @@ -584,6 +590,8 @@ private ObjectId resolveSimple(final String revstr) throws IOException { Collection matches = reader.resolve(id); if (matches.size() == 1) return matches.iterator().next(); + if (1 < matches.size()) + throw new AmbiguousObjectException(id, matches); } finally { reader.release(); }