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 57d4c39e3..5db6b86f8 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 CommitListAssert lanePos(int pos) { 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 void testEgitHistory() throws Exception { 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 pcl = new PlotCommitList(); + 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 40e6aba11..4a413c306 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 @@ void addChild(final PlotCommit c) { 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;