Throw AmbiguousObjectException during resolve if its ambiguous

Its wrong to return null if we are resolving an abbreviation and we
have proven it matches more than one object.  We know how to resolve
it if we had more nybbles, as there are two or more objects with the
same prefix.  Declare that to the caller quite clearly by giving them
an AmbiguousObjectException.

Change-Id: I01bb48e587e6d001b93da8575c2c81af3eda5a32
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2010-08-24 16:26:40 -07:00
parent c44495fa2f
commit 401d3b2cc1
2 changed files with 24 additions and 3 deletions

View File

@ -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<ObjectId> matches = reader.resolve(id.abbreviate(8));
AbbreviatedObjectId abbrev8 = id.abbreviate(8);
Collection<ObjectId> 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()));
}

View File

@ -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<ObjectId> matches = reader.resolve(id);
if (matches.size() == 1)
return matches.iterator().next();
if (1 < matches.size())
throw new AmbiguousObjectException(id, matches);
} finally {
reader.release();
}