Fix PlotCommit for commits with duplicate parents
JGit allows to create commits which have duplicate parents: e.g. a commit X has first parent Y and second parent Y. Such commits are not handled correctly by PlotCommit leading to wrong display of the history in EGit. In such cases there is a never ending passing line drawn beside all commits younger than the commit with duplicate parents. This commit fixes this by explicitly checking for duplicate parents. In a different commit we should fix JGit not to create commits with duplicate parents. I think native git also doesn't allow such commits, although history display in native git (gitk, git log --graph) is not damaged by such commits. Change-Id: Ie3019ef613a507023958bea27b1badc3b8950279
This commit is contained in:
parent
c0b4b79296
commit
b2f911bb69
|
@ -75,6 +75,13 @@ public CommitListAssert lanePos(int pos) {
|
||||||
return this;
|
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) {
|
public CommitListAssert parents(RevCommit... parents) {
|
||||||
assertEquals("Number of parents of commit #" + (nextIndex - 1)
|
assertEquals("Number of parents of commit #" + (nextIndex - 1)
|
||||||
+ " not as expected.", parents.length,
|
+ " not as expected.", parents.length,
|
||||||
|
@ -308,4 +315,31 @@ public void testEgitHistory() throws Exception {
|
||||||
test.commit(merge_fix).parents().lanePos(3);
|
test.commit(merge_fix).parents().lanePos(3);
|
||||||
test.noMoreCommits();
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,9 +100,13 @@ void addChild(final PlotCommit c) {
|
||||||
final int cnt = children.length;
|
final int cnt = children.length;
|
||||||
if (cnt == 0)
|
if (cnt == 0)
|
||||||
children = new PlotCommit[] { c };
|
children = new PlotCommit[] { c };
|
||||||
else if (cnt == 1)
|
else if (cnt == 1) {
|
||||||
children = new PlotCommit[] { children[0], c };
|
if (!c.getId().equals(children[0].getId()))
|
||||||
else {
|
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];
|
final PlotCommit[] n = new PlotCommit[cnt + 1];
|
||||||
System.arraycopy(children, 0, n, 0, cnt);
|
System.arraycopy(children, 0, n, 0, cnt);
|
||||||
n[cnt] = c;
|
n[cnt] = c;
|
||||||
|
|
Loading…
Reference in New Issue