James Moger
2012-09-10 fabe060d3a435f116128851f828e35c2af5fde67
src/com/gitblit/utils/PatchFormatter.java
@@ -1,3 +1,18 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.utils;
import java.io.IOException;
@@ -15,13 +30,19 @@
import com.gitblit.Constants;
/**
 * A diff formatter that outputs standard patch content.
 *
 * @author James Moger
 *
 */
public class PatchFormatter extends DiffFormatter {
   private final OutputStream os;
   private PatchTouple currentTouple = null;
   private Map<String, PatchTouple> changes = new HashMap<String, PatchTouple>();
   Map<String, PatchTouple> changes = new HashMap<String, PatchTouple>();
   private PatchTouple currentTouple;
   public PatchFormatter(OutputStream os) {
      super(os);
@@ -35,7 +56,8 @@
   }
   @Override
   protected void writeLine(final char prefix, final RawText text, final int cur) throws IOException {
   protected void writeLine(final char prefix, final RawText text, final int cur)
         throws IOException {
      switch (prefix) {
      case '+':
         currentTouple.insertions++;
@@ -53,9 +75,11 @@
      // I have no idea why that is there. it seems to be a constant.
      patch.append("From " + commit.getName() + " Mon Sep 17 00:00:00 2001" + "\n");
      patch.append("From: " + JGitUtils.getDisplayName(commit.getAuthorIdent()) + "\n");
      patch.append("Date: " + (new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(new Date(commit.getCommitTime() * 1000l))) + "\n");
      patch.append("Date: "
            + (new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(new Date(commit
                  .getCommitTime() * 1000L))) + "\n");
      patch.append("Subject: [PATCH] " + commit.getShortMessage() + "\n");
      patch.append("\n");
      patch.append('\n');
      patch.append("---");
      int maxPathLen = 0;
      int files = 0;
@@ -78,26 +102,34 @@
      }
      for (String path : changes.keySet()) {
         PatchTouple touple = changes.get(path);
         patch.append("\n " + StringUtils.rightPad(path, maxPathLen, ' ') + " | " + StringUtils.leftPad("" + touple.total(), 4, ' ') + " " + touple.relativeScale(unit));
         patch.append("\n " + StringUtils.rightPad(path, maxPathLen, ' ') + " | "
               + StringUtils.leftPad("" + touple.total(), 4, ' ') + " "
               + touple.relativeScale(unit));
      }
      patch.append(MessageFormat.format("\n {0} files changed, {1} insertions(+), {2} deletions(-)\n\n", files, insertions, deletions));
      patch.append(MessageFormat.format(
            "\n {0} files changed, {1} insertions(+), {2} deletions(-)\n\n", files, insertions,
            deletions));
      patch.append(os.toString());
      patch.append("\n--\n");
      patch.append(Constants.getRunningVersion());
      patch.append(Constants.getGitBlitVersion());
      return patch.toString();
   }
   private class PatchTouple {
      int insertions = 0;
      int deletions = 0;
   /**
    * Class that represents the number of insertions and deletions from a
    * chunk.
    */
   private static class PatchTouple {
      int insertions;
      int deletions;
      int total() {
         return insertions + deletions;
      }
      String relativeScale(int unit) {
         int plus = (insertions / unit);
         int minus = (deletions / unit);
         int plus = insertions / unit;
         int minus = deletions / unit;
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < plus; i++) {
            sb.append('+');