From f0ebfe6152959fda74bf7a5436bd765a0a231f6b Mon Sep 17 00:00:00 2001
From: Tom <tw201207@gmail.com>
Date: Thu, 06 Nov 2014 12:06:47 -0500
Subject: [PATCH] More diff page improvements

---
 src/main/java/com/gitblit/utils/DiffUtils.java |   39 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/gitblit/utils/DiffUtils.java b/src/main/java/com/gitblit/utils/DiffUtils.java
index 107f6ab..f597b94 100644
--- a/src/main/java/com/gitblit/utils/DiffUtils.java
+++ b/src/main/java/com/gitblit/utils/DiffUtils.java
@@ -228,15 +228,16 @@
 		DiffStat stat = null;
 		String diff = null;
 		try {
-			final ByteArrayOutputStream os = new ByteArrayOutputStream();
+			ByteArrayOutputStream os = null;
 			RawTextComparator cmp = RawTextComparator.DEFAULT;
 			DiffFormatter df;
 			switch (outputType) {
 			case HTML:
-				df = new GitBlitDiffFormatter(os, commit.getName());
+				df = new GitBlitDiffFormatter(commit.getName(), path);
 				break;
 			case PLAIN:
 			default:
+				os = new ByteArrayOutputStream();
 				df = new DiffFormatter(os);
 				break;
 			}
@@ -271,6 +272,7 @@
 			} else {
 				df.format(diffEntries);
 			}
+			df.flush();
 			if (df instanceof GitBlitDiffFormatter) {
 				// workaround for complex private methods in DiffFormatter
 				diff = ((GitBlitDiffFormatter) df).getHtml();
@@ -278,7 +280,6 @@
 			} else {
 				diff = os.toString();
 			}
-			df.flush();
 		} catch (Throwable t) {
 			LOGGER.error("failed to generate commit diff!", t);
 		}
@@ -346,6 +347,38 @@
 		return diff;
 	}
 
+	/**
+	 * Returns the diffstat between the two commits for the specified file or folder.
+	 *
+	 * @param repository
+	 * @param base
+	 *            if base commit is unspecified, the diffstat is generated against
+	 *            the primary parent of the specified tip.
+	 * @param tip
+	 * @param path
+	 *            if path is specified, the diffstat is generated only for the
+	 *            specified file or folder. if unspecified, the diffstat is
+	 *            generated for the entire diff between the two commits.
+	 * @return patch as a string
+	 */
+	public static DiffStat getDiffStat(Repository repository, String base, String tip) {
+		RevCommit baseCommit = null;
+		RevCommit tipCommit = null;
+		RevWalk revWalk = new RevWalk(repository);
+		try {
+			tipCommit = revWalk.parseCommit(repository.resolve(tip));
+			if (!StringUtils.isEmpty(base)) {
+				baseCommit = revWalk.parseCommit(repository.resolve(base));
+			}
+			return getDiffStat(repository, baseCommit, tipCommit, null);
+		} catch (Exception e) {
+			LOGGER.error("failed to generate diffstat!", e);
+		} finally {
+			revWalk.dispose();
+		}
+		return null;
+	}
+
 	public static DiffStat getDiffStat(Repository repository, RevCommit commit) {
 		return getDiffStat(repository, null, commit, null);
 	}

--
Gitblit v1.9.1