diff options
author | Christian Halstrick <christian.halstrick@sap.com> | 2011-12-02 14:27:51 +0100 |
---|---|---|
committer | Christian Halstrick <christian.halstrick@sap.com> | 2011-12-02 14:27:51 +0100 |
commit | df8511eeea1a047355c53615e318f53bf6863648 (patch) | |
tree | 0b12449d7b6510ae006cc125838fa6fab777fe63 | |
parent | cea935ab1b6caf52b31dfd4eae9696dfcc0593a2 (diff) | |
download | jgit-df8511eeea1a047355c53615e318f53bf6863648.tar.gz jgit-df8511eeea1a047355c53615e318f53bf6863648.zip |
Fix History rendering
There was the possibility that during history rendering we draw a lane
"trough" a passed commit. Vadim Dmitriev found that out in bug 335818.
I added the needed check to that block of code where it was missing.
Bug: 335818
Change-Id: Ic944193b2aca55ff3eb0235d46afa60b7896aa0f
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java index 6ffa0336aa..e8263c5a93 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revplot/PlotCommitList.java @@ -141,6 +141,7 @@ public class PlotCommitList<L extends PlotLane> extends } currCommit.lane = c.lane; + handleBlockedLanes(index, currCommit, nChildren); } else { // More than one child, or our child is a merge. // Use a different lane. @@ -189,39 +190,50 @@ public class PlotCommitList<L extends PlotLane> extends currCommit.lane = nextFreeLane(); activeLanes.add(currCommit.lane); - // take care: when connecting yourself to your child make sure that - // you will not be located on a lane on which a passed commit is - // located on. Otherwise we would have to draw a line through a - // commit. - int remaining = nChildren; - BitSet blockedPositions = new BitSet(); - for (int r = index - 1; r >= 0; r--) { - final PlotCommit rObj = get(r); - if (currCommit.isChild(rObj)) { - if (--remaining == 0) - break; - } - if (rObj != null) { - PlotLane lane = rObj.getLane(); - if (lane != null) - blockedPositions.set(lane.getPosition()); - rObj.addPassingLane(currCommit.lane); - } + handleBlockedLanes(index, currCommit, nChildren); + } + } + + /** + * when connecting a plotcommit to the child make sure that you will not be + * located on a lane on which a passed commit is located on. Otherwise we + * would have to draw a line through a commit. + * + * @param index + * @param commit + * @param nChildren + */ + private void handleBlockedLanes(final int index, + final PlotCommit<L> commit, final int nChildren) { + // take care: + int remaining = nChildren; + BitSet blockedPositions = new BitSet(); + for (int r = index - 1; r >= 0; r--) { + final PlotCommit rObj = get(r); + if (commit.isChild(rObj)) { + if (--remaining == 0) + break; } - // Now let's check whether we have to reposition the lane - if (blockedPositions.get(currCommit.lane.getPosition())) { - int newPos = -1; - for (Integer pos : freePositions) - if (!blockedPositions.get(pos)) { - newPos = pos; - break; - } - if (newPos == -1) - newPos = positionsAllocated++; - freePositions.add(currCommit.lane.getPosition()); - currCommit.lane.position = newPos; + if (rObj != null) { + PlotLane lane = rObj.getLane(); + if (lane != null) + blockedPositions.set(lane.getPosition()); + rObj.addPassingLane(commit.lane); } } + // Now let's check whether we have to reposition the lane + if (blockedPositions.get(commit.lane.getPosition())) { + int newPos = -1; + for (Integer pos : freePositions) + if (!blockedPositions.get(pos)) { + newPos = pos; + break; + } + if (newPos == -1) + newPos = positionsAllocated++; + freePositions.add(commit.lane.getPosition()); + commit.lane.position = newPos; + } } private void closeLane(PlotLane lane) { |