Replace manual peel loops with RevWalk.peel

Instead of peeling things by hand in application level code, defer
the peeling logic into RevWalk's new peel utility method.

Change-Id: Idabd10dc41502e782f6a2eeb56f09566b97775a8
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2010-06-23 17:26:44 -07:00
parent 599c0ce745
commit 47c07e1a0d
4 changed files with 35 additions and 23 deletions

View File

@ -409,12 +409,8 @@ public Ref peel(final Ref ref) throws IOException {
RevObject obj = rw.parseAny(leaf.getObjectId());
ObjectIdRef newLeaf;
if (obj instanceof RevTag) {
do {
obj = rw.parseAny(((RevTag) obj).getObject());
} while (obj instanceof RevTag);
newLeaf = new ObjectIdRef.PeeledTag(leaf.getStorage(), leaf
.getName(), leaf.getObjectId(), obj.copy());
.getName(), leaf.getObjectId(), rw.peel(obj).copy());
} else {
newLeaf = new ObjectIdRef.PeeledNonTag(leaf.getStorage(), leaf
.getName(), leaf.getObjectId());

View File

@ -659,11 +659,7 @@ public RevObject lookupAny(final AnyObjectId id, final int type) {
public RevCommit parseCommit(final AnyObjectId id)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
RevObject c = parseAny(id);
while (c instanceof RevTag) {
c = ((RevTag) c).getObject();
parseHeaders(c);
}
RevObject c = peel(parseAny(id));
if (!(c instanceof RevCommit))
throw new IncorrectObjectTypeException(id.toObjectId(),
Constants.TYPE_COMMIT);
@ -690,11 +686,7 @@ public RevCommit parseCommit(final AnyObjectId id)
public RevTree parseTree(final AnyObjectId id)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
RevObject c = parseAny(id);
while (c instanceof RevTag) {
c = ((RevTag) c).getObject();
parseHeaders(c);
}
RevObject c = peel(parseAny(id));
final RevTree t;
if (c instanceof RevCommit)
@ -802,6 +794,29 @@ public void parseBody(final RevObject obj)
obj.parseBody(this);
}
/**
* Peel back annotated tags until a non-tag object is found.
*
* @param obj
* the starting object.
* @return If {@code obj} is not an annotated tag, {@code obj}. Otherwise
* the first non-tag object that {@code obj} references. The
* returned object's headers have been parsed.
* @throws MissingObjectException
* a referenced object cannot be found.
* @throws IOException
* a pack file or loose object could not be read.
*/
public RevObject peel(RevObject obj) throws MissingObjectException,
IOException {
while (obj instanceof RevTag) {
parseHeaders(obj);
obj = ((RevTag) obj).getObject();
}
parseHeaders(obj);
return obj;
}
/**
* Create a new flag for application use during walking.
* <p>

View File

@ -84,7 +84,6 @@
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevFlag;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.ReceiveCommand.Result;
@ -818,8 +817,7 @@ private void checkConnectivity() throws IOException {
ow.markUninteresting(o);
if (checkReferencedIsReachable && !baseObjects.isEmpty()) {
while (o instanceof RevTag)
o = ((RevTag) o).getObject();
o = ow.peel(o);
if (o instanceof RevCommit)
o = ((RevCommit) o).getTree();
if (o instanceof RevTree)

View File

@ -56,6 +56,7 @@
import java.util.Set;
import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.errors.PackProtocolException;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.ObjectId;
@ -393,11 +394,15 @@ private void recvWants() throws IOException {
}
if (!o.has(ADVERTISED))
throw new PackProtocolException(MessageFormat.format(JGitText.get().notValid, id.name()));
want(o);
try {
want(o);
} catch (IOException e) {
throw new PackProtocolException(MessageFormat.format(JGitText.get().notValid, id.name()), e);
}
}
}
private void want(RevObject o) {
private void want(RevObject o) throws MissingObjectException, IOException {
if (!o.has(WANT)) {
o.add(WANT);
wantAll.add(o);
@ -406,9 +411,7 @@ private void want(RevObject o) {
wantCommits.add((RevCommit) o);
else if (o instanceof RevTag) {
do {
o = ((RevTag) o).getObject();
} while (o instanceof RevTag);
o = walk.peel(o);
if (o instanceof RevCommit)
want(o);
}