From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001
From: Gerard Smyth <gerard.smyth@gmail.com>
Date: Thu, 08 May 2014 13:09:30 -0400
Subject: [PATCH] Updated the SyndicationServlet to provide an additional option to return details of the tags in the repository instead of the commits. This uses a new 'ot' request parameter to indicate the object type of the content to return, which can be ither TAG or COMMIT. If this is not provided, then COMMIT is assumed to maintain backwards compatability. If tags are returned, then the paging parameters, 'l' and 'pg' are still supported, but searching options are currently ignored.

---
 src/main/java/com/gitblit/utils/DiffUtils.java |   70 +++++++++++++++++++++++++---------
 1 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/gitblit/utils/DiffUtils.java b/src/main/java/com/gitblit/utils/DiffUtils.java
index 3c52cb0..dd2a780 100644
--- a/src/main/java/com/gitblit/utils/DiffUtils.java
+++ b/src/main/java/com/gitblit/utils/DiffUtils.java
@@ -66,23 +66,23 @@
 			return null;
 		}
 	}
-	
+
 	/**
-	 * Encapsulates the output of a diff. 
+	 * Encapsulates the output of a diff.
 	 */
 	public static class DiffOutput implements Serializable {
 		private static final long serialVersionUID = 1L;
-		
+
 		public final DiffOutputType type;
 		public final String content;
 		public final DiffStat stat;
-		
+
 		DiffOutput(DiffOutputType type, String content, DiffStat stat) {
 			this.type = type;
 			this.content = content;
 			this.stat = stat;
 		}
-		
+
 		public PathChangeModel getPath(String path) {
 			if (stat == null) {
 				return null;
@@ -98,15 +98,15 @@
 	public static class DiffStat implements Serializable {
 
 		private static final long serialVersionUID = 1L;
-		
+
 		public final List<PathChangeModel> paths = new ArrayList<PathChangeModel>();
-		
+
 		private final String commitId;
-		
+
 		public DiffStat(String commitId) {
 			this.commitId = commitId;
 		}
-		
+
 		public PathChangeModel addPath(DiffEntry entry) {
 			PathChangeModel pcm = PathChangeModel.from(entry, commitId);
 			paths.add(pcm);
@@ -128,7 +128,7 @@
 			}
 			return val;
 		}
-		
+
 		public PathChangeModel getPath(String path) {
 			PathChangeModel stat = null;
 			for (PathChangeModel p : paths) {
@@ -138,7 +138,7 @@
 				}
 			}
 			return stat;
-		}		
+		}
 
 		@Override
 		public String toString() {
@@ -150,15 +150,15 @@
 			return sb.toString();
 		}
 	}
-	
+
 	public static class NormalizedDiffStat implements Serializable {
-		
+
 		private static final long serialVersionUID = 1L;
-		
+
 		public final int insertions;
 		public final int deletions;
 		public final int blanks;
-		
+
 		NormalizedDiffStat(int insertions, int deletions, int blanks) {
 			this.insertions = insertions;
 			this.deletions = deletions;
@@ -282,7 +282,7 @@
 		} catch (Throwable t) {
 			LOGGER.error("failed to generate commit diff!", t);
 		}
-		
+
 		return new DiffOutput(outputType, diff, stat);
 	}
 
@@ -344,6 +344,38 @@
 			LOGGER.error("failed to generate commit diff!", t);
 		}
 		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) {
@@ -442,10 +474,10 @@
 		}
 		return lines;
 	}
-	
+
 	/**
 	 * Normalizes a diffstat to an N-segment display.
-	 * 
+	 *
 	 * @params segments
 	 * @param insertions
 	 * @param deletions
@@ -482,7 +514,7 @@
 			sd = segments - si;
 			sb = 0;
 		}
-		
+
 		return new NormalizedDiffStat(si, sd, sb);
 	}
 }

--
Gitblit v1.9.1