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:
parent
74d279fbf0
commit
d0f8d1e819
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue