James Moger
2013-11-26 4fcac9d2cbdafb51e3ee9ca3b3da64fd86103174
src/main/java/com/gitblit/BranchGraphServlet.java
@@ -32,6 +32,8 @@
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
@@ -53,9 +55,9 @@
/**
 * Handles requests for branch graphs
 *
 *
 * @author James Moger
 *
 *
 */
public class BranchGraphServlet extends HttpServlet {
@@ -80,7 +82,7 @@
   /**
    * Returns an url to this servlet for the specified parameters.
    *
    *
    * @param baseURL
    * @param repository
    * @param objectId
@@ -146,18 +148,41 @@
         }
         // fetch the requested commits plus some extra so that the last
         // commit displayed *likely* has correct lane assignments
         // commit displayed *likely* has correct lane assignments
         CommitList commitList = new CommitList();
         commitList.source(rw);
         commitList.fillTo(2*Math.max(requestedCommits, maxCommits));
         // determine the appropriate width for the image
         int numLanes = 0;
         int numCommits = Math.min(requestedCommits, commitList.size());
         for (int i = 0; i < numCommits; i++) {
            PlotCommit<Lane> commit = commitList.get(i);
            int pos = commit.getLane().getPosition();
            numLanes = Math.max(numLanes, pos + 1);
         int numLanes = 1;
         int numCommits = Math.min(requestedCommits, commitList.size());
         if (numCommits > 1) {
            // determine graph width
            Set<String> parents = new TreeSet<String>();
            for (int i = 0; i < commitList.size(); i++) {
               PlotCommit<Lane> commit = commitList.get(i);
               boolean checkLane = false;
               if (i < numCommits) {
                  // commit in visible list
                  checkLane = true;
                  // remember parents
                  for (RevCommit p : commit.getParents()) {
                     parents.add(p.getName());
                  }
               } else if (parents.contains(commit.getName())) {
                  // commit outside visible list, but it is a parent of a
                  // commit in the visible list so we need to know it's lane
                  // assignment
                  checkLane = true;
               }
               if (checkLane) {
                  int pos = commit.getLane().getPosition();
                  numLanes = Math.max(numLanes, pos + 1);
               }
            }
         }
         int graphWidth = numLanes * LANE_WIDTH + RIGHT_PAD;
@@ -165,12 +190,13 @@
         // create an image buffer and render the lanes
         BufferedImage image = new BufferedImage(graphWidth, rowHeight*numCommits, BufferedImage.TYPE_INT_ARGB);
         Graphics2D g = null;
         try {
            g = image.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            LanesRenderer renderer = new LanesRenderer();
            for (int i = 0; i < numCommits; i++) {
            for (int i = 0; i < commitList.size(); i++) {
               PlotCommit<Lane> commit = commitList.get(i);
               Graphics row = g.create(0, i*rowHeight, graphWidth, rowHeight);
               try {
@@ -189,7 +215,7 @@
         // write the image buffer to the client
         response.setContentType("image/png");
         if (numCommits > 0) {
         if (numCommits > 1) {
            response.setHeader("Cache-Control", "public, max-age=60, must-revalidate");
            response.setDateHeader("Last-Modified", JGitUtils.getCommitDate(commitList.get(0)).getTime());
         }