From c3f4f124f1b9e45d7696f3c16f958d1c81ff280a Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 21 Apr 2011 21:46:47 -0400
Subject: [PATCH] Use markdown for welcome message.  Simplify login page appearance.

---
 src/com/gitblit/utils/JGitUtils.java |  133 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 111 insertions(+), 22 deletions(-)

diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index b126768..cd3e6ef 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -15,6 +15,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffFormatter;
@@ -36,6 +37,7 @@
 import org.eclipse.jgit.revwalk.RevBlob;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevSort;
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.revwalk.filter.RevFilter;
@@ -99,6 +101,34 @@
 			}
 		}
 		return list;
+	}
+
+	public static RevCommit getFirstCommit(Repository r, String branch) {
+		if (StringUtils.isEmpty(branch)) {
+			branch = Constants.HEAD;
+		}
+		try {
+			RevWalk walk = new RevWalk(r);
+			walk.sort(RevSort.REVERSE);
+			RevCommit head = walk.parseCommit(r.resolve(branch));
+			walk.markStart(head);
+			RevCommit commit = walk.next();
+			walk.dispose();
+			return commit;
+		} catch (Throwable t) {
+			LOGGER.error("Failed to determine first commit", t);
+		}
+		return null;
+	}
+
+	public static Date getFirstChange(Repository r, String branch) {
+		try {
+			RevCommit commit = getFirstCommit(r, branch);
+			return getCommitDate(commit);
+		} catch (Throwable t) {
+			LOGGER.error("Failed to determine first change", t);
+		}
+		return null;
 	}
 
 	public static Date getLastChange(Repository r) {
@@ -297,19 +327,43 @@
 		return list;
 	}
 
-	public static String getCommitDiff(Repository r, RevCommit commit, boolean outputHtml) {
-		return getCommitDiff(r, null, commit, null, outputHtml);
+	public static Map<ChangeType, AtomicInteger> getChangedPathsStats(List<PathChangeModel> paths) {
+		Map<ChangeType, AtomicInteger> stats = new HashMap<ChangeType, AtomicInteger>();
+		for (PathChangeModel path : paths) {
+			if (!stats.containsKey(path.changeType)) {
+				stats.put(path.changeType, new AtomicInteger(0));
+			}
+			stats.get(path.changeType).incrementAndGet();
+		}
+		return stats;
 	}
 
-	public static String getCommitDiff(Repository r, RevCommit commit, String path, boolean outputHtml) {
-		return getCommitDiff(r, null, commit, path, outputHtml);
+	public static enum DiffOutputType {
+		PLAIN, GITWEB, GITBLIT;
+
+		public static DiffOutputType forName(String name) {
+			for (DiffOutputType type : values()) {
+				if (type.name().equalsIgnoreCase(name)) {
+					return type;
+				}
+			}
+			return null;
+		}
 	}
 
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, boolean outputHtml) {
-		return getCommitDiff(r, baseCommit, commit, null, outputHtml);
+	public static String getCommitDiff(Repository r, RevCommit commit, DiffOutputType outputType) {
+		return getCommitDiff(r, null, commit, null, outputType);
 	}
 
-	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, String path, boolean outputHtml) {
+	public static String getCommitDiff(Repository r, RevCommit commit, String path, DiffOutputType outputType) {
+		return getCommitDiff(r, null, commit, path, outputType);
+	}
+
+	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, DiffOutputType outputType) {
+		return getCommitDiff(r, baseCommit, commit, null, outputType);
+	}
+
+	public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, String path, DiffOutputType outputType) {
 		try {
 			RevTree baseTree;
 			if (baseCommit == null) {
@@ -333,10 +387,17 @@
 			final ByteArrayOutputStream os = new ByteArrayOutputStream();
 			RawTextComparator cmp = RawTextComparator.DEFAULT;
 			DiffFormatter df;
-			if (outputHtml) {
-				df = new HtmlDiffFormatter(os);
-			} else {
+			switch (outputType) {
+			case GITWEB:
+				df = new GitWebDiffFormatter(os);
+				break;
+			case GITBLIT:
+				df = new GitBlitDiffFormatter(os);
+				break;
+			case PLAIN:
+			default:
 				df = new DiffFormatter(os);
+				break;
 			}
 			df.setRepository(r);
 			df.setDiffComparator(cmp);
@@ -353,9 +414,9 @@
 				df.format(diffs);
 			}
 			String diff;
-			if (outputHtml) {
+			if (df instanceof GitWebDiffFormatter) {
 				// workaround for complex private methods in DiffFormatter
-				diff = ((HtmlDiffFormatter) df).getHtml();
+				diff = ((GitWebDiffFormatter) df).getHtml();
 			} else {
 				diff = os.toString();
 			}
@@ -525,7 +586,7 @@
 			}
 			return null;
 		}
-		
+
 		public String toString() {
 			return name().toLowerCase();
 		}
@@ -552,7 +613,7 @@
 					case AUTHOR:
 						return (commit.getAuthorIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getAuthorIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
 					case COMMITTER:
-						return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1)|| (commit.getCommitterIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
+						return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getCommitterIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
 					case COMMIT:
 						return commit.getFullMessage().toLowerCase().indexOf(lcValue) > -1;
 					}
@@ -695,29 +756,57 @@
 
 	public static List<Metric> getDateMetrics(Repository r) {
 		final List<RefModel> tags = getTags(r, -1);
-		final Map<String, Metric> map = new HashMap<String, Metric>();
+		final Map<ObjectId, RefModel> tagMap = new HashMap<ObjectId, RefModel>();
+		for (RefModel tag : tags) {
+			tagMap.put(tag.getCommitId(), tag);
+		}
+		Metric total = new Metric("TOTAL");
+		final Map<String, Metric> metricMap = new HashMap<String, Metric>();
 		try {
-			DateFormat df = new SimpleDateFormat("yyyy-MM");
 			RevWalk walk = new RevWalk(r);
 			ObjectId object = r.resolve(Constants.HEAD);
-			walk.markStart(walk.parseCommit(object));
+
+			RevCommit firstCommit = getFirstCommit(r, Constants.HEAD);
+			RevCommit lastCommit = walk.parseCommit(object);
+			int diffDays = (lastCommit.getCommitTime() - firstCommit.getCommitTime()) / (60 * 60 * 24);
+			total.duration = diffDays;
+			DateFormat df;
+			if (diffDays <= 90) {
+				// Days
+				df = new SimpleDateFormat("yyyy-MM-dd");
+			} else if (diffDays > 90 && diffDays < 365) {
+				// Weeks
+				df = new SimpleDateFormat("yyyy-MM (w)");
+			} else {
+				// Months
+				df = new SimpleDateFormat("yyyy-MM");
+			}
+			walk.markStart(lastCommit);
+
 			Iterable<RevCommit> revlog = walk;
 			for (RevCommit rev : revlog) {
 				Date d = getCommitDate(rev);
 				String p = df.format(d);
-				if (!map.containsKey(p))
-					map.put(p, new Metric(p));
-				map.get(p).count++;
+				if (!metricMap.containsKey(p))
+					metricMap.put(p, new Metric(p));
+				Metric m = metricMap.get(p);
+				m.count++;
+				total.count++;
+				if (tagMap.containsKey(rev.getId())) {
+					m.tag++;
+					total.tag++;
+				}
 			}
 		} catch (Throwable t) {
 			LOGGER.error("Failed to mine log history for metrics", t);
 		}
-		List<String> keys = new ArrayList<String>(map.keySet());
+		List<String> keys = new ArrayList<String>(metricMap.keySet());
 		Collections.sort(keys);
 		List<Metric> metrics = new ArrayList<Metric>();
 		for (String key : keys) {
-			metrics.add(map.get(key));
+			metrics.add(metricMap.get(key));
 		}
+		metrics.add(0, total);
 		return metrics;
 	}
 

--
Gitblit v1.9.1