From 4b441d259cbb76c1136e3e8899ebc4e35ab7de2e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 02 Jul 2014 17:45:43 -0400
Subject: [PATCH] Merged #124 "Update to Freemarker 2.3.20"
---
src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java | 92 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 81 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java b/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java
index f871e77..47ff143 100644
--- a/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java
+++ b/src/main/java/com/gitblit/utils/GitBlitDiffFormatter.java
@@ -16,35 +16,53 @@
package com.gitblit.utils;
import static org.eclipse.jgit.lib.Constants.encode;
+import static org.eclipse.jgit.lib.Constants.encodeASCII;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.MessageFormat;
+import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffFormatter;
import org.eclipse.jgit.diff.RawText;
import org.eclipse.jgit.util.RawParseUtils;
+import com.gitblit.models.PathModel.PathChangeModel;
+import com.gitblit.utils.DiffUtils.DiffStat;
+
/**
- * Generates an html snippet of a diff in Gitblit's style.
- *
+ * Generates an html snippet of a diff in Gitblit's style, tracks changed paths,
+ * and calculates diff stats.
+ *
* @author James Moger
- *
+ *
*/
-public class GitBlitDiffFormatter extends GitWebDiffFormatter {
+public class GitBlitDiffFormatter extends DiffFormatter {
private final OutputStream os;
+ private final DiffStat diffStat;
+
+ private PathChangeModel currentPath;
+
private int left, right;
- public GitBlitDiffFormatter(OutputStream os) {
+ public GitBlitDiffFormatter(OutputStream os, String commitId) {
super(os);
this.os = os;
+ this.diffStat = new DiffStat(commitId);
+ }
+
+ @Override
+ public void format(DiffEntry ent) throws IOException {
+ currentPath = diffStat.addPath(ent);
+ super.format(ent);
}
/**
* Output a hunk header
- *
+ *
* @param aStartLine
* within first source
* @param aEndLine
@@ -71,9 +89,46 @@
right = bStartLine + 1;
}
+ protected void writeRange(final char prefix, final int begin, final int cnt) throws IOException {
+ os.write(' ');
+ os.write(prefix);
+ switch (cnt) {
+ case 0:
+ // If the range is empty, its beginning number must
+ // be the
+ // line just before the range, or 0 if the range is
+ // at the
+ // start of the file stream. Here, begin is always 1
+ // based,
+ // so an empty file would produce "0,0".
+ //
+ os.write(encodeASCII(begin - 1));
+ os.write(',');
+ os.write('0');
+ break;
+
+ case 1:
+ // If the range is exactly one line, produce only
+ // the number.
+ //
+ os.write(encodeASCII(begin));
+ break;
+
+ default:
+ os.write(encodeASCII(begin));
+ os.write(',');
+ os.write(encodeASCII(cnt));
+ break;
+ }
+ }
+
@Override
protected void writeLine(final char prefix, final RawText text, final int cur)
throws IOException {
+ // update entry diffstat
+ currentPath.update(prefix);
+
+ // output diff
os.write("<tr>".getBytes());
switch (prefix) {
case '+':
@@ -107,10 +162,9 @@
/**
* Workaround function for complex private methods in DiffFormatter. This
* sets the html for the diff headers.
- *
+ *
* @return
*/
- @Override
public String getHtml() {
ByteArrayOutputStream bos = (ByteArrayOutputStream) os;
String html = RawParseUtils.decode(bos.toByteArray());
@@ -137,10 +191,10 @@
} else {
// use a
line = line.substring("diff --git ".length()).trim();
- line = line.substring(line.startsWith("\"a/") ? 3 : 2);
+ line = line.substring(line.startsWith("\"a/") ? 3 : 2);
line = line.substring(0, line.indexOf(" b/") > -1 ? line.indexOf(" b/") : line.indexOf("\"b/")).trim();
}
-
+
if (line.charAt(0) == '"') {
line = line.substring(1);
}
@@ -151,16 +205,32 @@
sb.append("</tbody></table></div>\n");
inFile = false;
}
-
+
sb.append(MessageFormat.format("<div class='header'><div class=\"diffHeader\" id=\"{0}\"><i class=\"icon-file\"></i> ", line)).append(line).append("</div></div>");
sb.append("<div class=\"diff\">");
sb.append("<table><tbody>");
inFile = true;
} else {
+ boolean gitLinkDiff = line.length() > 0 && line.substring(1).startsWith("Subproject commit");
+ if (gitLinkDiff) {
+ sb.append("<tr><th></th><th></th>");
+ if (line.charAt(0) == '+') {
+ sb.append("<td><div class=\"diff add2\">");
+ } else {
+ sb.append("<td><div class=\"diff remove2\">");
+ }
+ }
sb.append(line);
+ if (gitLinkDiff) {
+ sb.append("</div></td></tr>");
+ }
}
}
sb.append("</table></div>");
return sb.toString();
}
+
+ public DiffStat getDiffStat() {
+ return diffStat;
+ }
}
--
Gitblit v1.9.1