Fix tag sorting in PlotWalk

By deferring tag sorting until the commit is produced by the walker
we can avoid an infinite loop that was triggered by trying to sort
tags while allocating a commit.  This also avoids needing to look
at commits which aren't going to be produced in the result.

Bug: 321103
Change-Id: I25acc739db2ec0221a50b72c2d2aa618a9a75f37
Reviewed-by: Mathias Kinzler <mathias.kinzler@sap.com>
Reviewed-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2010-07-28 11:44:00 -07:00
parent 74d279fbf0
commit d0f8d1e819
2 changed files with 17 additions and 14 deletions

View File

@ -65,19 +65,16 @@ public class PlotCommit<L extends PlotLane> extends RevCommit {
PlotCommit[] children; PlotCommit[] children;
final Ref[] refs; Ref[] refs;
/** /**
* Create a new commit. * Create a new commit.
* *
* @param id * @param id
* the identity of this commit. * the identity of this commit.
* @param tags
* the tags associated with this commit, null for no tags
*/ */
protected PlotCommit(final AnyObjectId id, final Ref[] tags) { protected PlotCommit(final AnyObjectId id) {
super(id); super(id);
this.refs = tags;
passingLanes = NO_LANES; passingLanes = NO_LANES;
children = NO_CHILDREN; children = NO_CHILDREN;
} }

View File

@ -45,12 +45,15 @@
package org.eclipse.jgit.revplot; package org.eclipse.jgit.revplot;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.eclipse.jgit.JGitText; import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Ref;
@ -93,23 +96,26 @@ public void sort(final RevSort s, final boolean use) {
@Override @Override
protected RevCommit createCommit(final AnyObjectId id) { protected RevCommit createCommit(final AnyObjectId id) {
return new PlotCommit(id, getTags(id)); return new PlotCommit(id);
} }
/** @Override
* @param commitId public RevCommit next() throws MissingObjectException,
* @return return the list of knows tags referring to this commit IncorrectObjectTypeException, IOException {
*/ PlotCommit<?> pc = (PlotCommit) super.next();
protected Ref[] getTags(final AnyObjectId commitId) { if (pc != null)
pc.refs = getTags(pc);
return pc;
}
private Ref[] getTags(final AnyObjectId commitId) {
Collection<Ref> list = reverseRefMap.get(commitId); Collection<Ref> list = reverseRefMap.get(commitId);
Ref[] tags; Ref[] tags;
if (list == null) if (list == null)
tags = null; tags = null;
else { else {
tags = list.toArray(new Ref[list.size()]); tags = list.toArray(new Ref[list.size()]);
// TODO hotfix, this results in a loop and consequently stack overflow Arrays.sort(tags, new PlotRefComparator());
// when opening the history view in EGit
// Arrays.sort(tags, new PlotRefComparator());
} }
return tags; return tags;
} }