summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java34
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java10
2 files changed, 41 insertions, 3 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java
index 57d4c39e37..5db6b86f81 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revplot/PlotCommitListTest.java
@@ -75,6 +75,13 @@ public class PlotCommitListTest extends RevWalkTestCase {
return this;
}
+ public CommitListAssert nrOfPassingLanes(int lanes) {
+ assertEquals("Number of passing lanes of commit #"
+ + (nextIndex - 1)
+ + " not as expected.", lanes, current.passingLanes.length);
+ return this;
+ }
+
public CommitListAssert parents(RevCommit... parents) {
assertEquals("Number of parents of commit #" + (nextIndex - 1)
+ " not as expected.", parents.length,
@@ -308,4 +315,31 @@ public class PlotCommitListTest extends RevWalkTestCase {
test.commit(merge_fix).parents().lanePos(3);
test.noMoreCommits();
}
+
+ // test a history where a merge commit has two time the same parent
+ @Test
+ public void testDuplicateParents() throws Exception {
+ final RevCommit m1 = commit();
+ final RevCommit m2 = commit(m1);
+ final RevCommit m3 = commit(m2, m2);
+
+ final RevCommit s1 = commit(m2);
+ final RevCommit s2 = commit(s1);
+
+ PlotWalk pw = new PlotWalk(db);
+ pw.markStart(pw.lookupCommit(m3));
+ pw.markStart(pw.lookupCommit(s2));
+ PlotCommitList<PlotLane> pcl = new PlotCommitList<PlotLane>();
+ pcl.source(pw);
+ pcl.fillTo(Integer.MAX_VALUE);
+
+ CommitListAssert test = new CommitListAssert(pcl);
+ test.commit(s2).nrOfPassingLanes(0);
+ test.commit(s1).nrOfPassingLanes(0);
+ test.commit(m3).nrOfPassingLanes(1);
+ test.commit(m2).nrOfPassingLanes(0);
+ test.commit(m1).nrOfPassingLanes(0);
+ test.noMoreCommits();
+ }
+
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
index 40e6aba11e..4a413c306a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommit.java
@@ -100,9 +100,13 @@ public class PlotCommit<L extends PlotLane> extends RevCommit {
final int cnt = children.length;
if (cnt == 0)
children = new PlotCommit[] { c };
- else if (cnt == 1)
- children = new PlotCommit[] { children[0], c };
- else {
+ else if (cnt == 1) {
+ if (!c.getId().equals(children[0].getId()))
+ children = new PlotCommit[] { children[0], c };
+ } else {
+ for (PlotCommit pc : children)
+ if (c.getId().equals(pc.getId()))
+ return;
final PlotCommit[] n = new PlotCommit[cnt + 1];
System.arraycopy(children, 0, n, 0, cnt);
n[cnt] = c;