From df8511eeea1a047355c53615e318f53bf6863648 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Fri, 2 Dec 2011 14:27:51 +0100 Subject: [PATCH] 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 --- .../eclipse/jgit/revplot/PlotCommitList.java | 72 +++++++++++-------- 1 file 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 6ffa0336a..e8263c5a9 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 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 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 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) {