From 9bc17d16ea48a7978b198126d346828b1d24fe4e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 18 Apr 2011 22:29:20 -0400
Subject: [PATCH] Color-coded change type indicator with tooltip for changed paths.

---
 src/com/gitblit/wicket/RepositoryPage.java       |   20 ++++++
 src/com/gitblit/wicket/models/PathModel.java     |   14 ++++
 src/com/gitblit/wicket/pages/CommitPage.html     |    1 
 src/com/gitblit/wicket/resources/gitblit.css     |   27 ++++++++
 gitblit.properties                               |    4 
 src/com/gitblit/wicket/GitBlitWebApp.properties  |    6 +
 src/com/gitblit/wicket/WicketUtils.java          |   21 ++++++
 src/com/gitblit/wicket/pages/CommitDiffPage.html |    1 
 src/com/gitblit/wicket/pages/CommitPage.java     |   16 +++--
 src/com/gitblit/wicket/panels/HistoryPanel.java  |    5 +
 src/com/gitblit/wicket/pages/CommitDiffPage.java |   17 +++--
 src/com/gitblit/tests/JGitUtilsTest.java         |    4 
 src/com/gitblit/utils/JGitUtils.java             |   14 +++-
 13 files changed, 125 insertions(+), 25 deletions(-)

diff --git a/gitblit.properties b/gitblit.properties
index ecefedf..a81e5f6 100644
--- a/gitblit.properties
+++ b/gitblit.properties
@@ -130,11 +130,11 @@
 
 # Specify the interface for Jetty to bind the standard connector.
 # You may specify an ip or an empty value to bind to all interfaces. 
-server.httpBindInterface = localhost
+server.httpBindInterface = 
 
 # Specify the interface for Jetty to bind the secure connector.
 # You may specify an ip or an empty value to bind to all interfaces.
-server.httpsBindInterface = localhost
+server.httpsBindInterface = 
 
 # Password for SSL keystore (keystore password and certificate password must match)
 server.storePassword = dosomegit
diff --git a/src/com/gitblit/tests/JGitUtilsTest.java b/src/com/gitblit/tests/JGitUtilsTest.java
index b6b497f..0ebcd71 100644
--- a/src/com/gitblit/tests/JGitUtilsTest.java
+++ b/src/com/gitblit/tests/JGitUtilsTest.java
@@ -15,7 +15,7 @@
 import org.eclipse.jgit.storage.file.FileRepository;
 
 import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.models.RefModel;
 import com.gitblit.wicket.models.TicketModel;
 
@@ -82,7 +82,7 @@
 	public void testFilesInCommit() throws Exception {
 		Repository r = getRepository();
 		RevCommit commit = JGitUtils.getCommit(r, Constants.HEAD);
-		List<PathModel> paths = JGitUtils.getFilesInCommit(r, commit);
+		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);
 		r.close();
 		assertTrue("No changed paths found!", paths.size() > 0);
 	}
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 49fbf1e..b126768 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -19,6 +19,7 @@
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.diff.RawTextComparator;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -49,6 +50,7 @@
 
 import com.gitblit.wicket.models.Metric;
 import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.models.RefModel;
 import com.gitblit.wicket.models.TicketModel;
 import com.gitblit.wicket.models.TicketModel.Comment;
@@ -256,13 +258,13 @@
 		return list;
 	}
 
-	public static List<PathModel> getFilesInCommit(Repository r, String commitId) {
+	public static List<PathChangeModel> getFilesInCommit(Repository r, String commitId) {
 		RevCommit commit = getCommit(r, commitId);
 		return getFilesInCommit(r, commit);
 	}
 
-	public static List<PathModel> getFilesInCommit(Repository r, RevCommit commit) {
-		List<PathModel> list = new ArrayList<PathModel>();
+	public static List<PathChangeModel> getFilesInCommit(Repository r, RevCommit commit) {
+		List<PathChangeModel> list = new ArrayList<PathChangeModel>();
 		try {
 			final RevWalk rw = new RevWalk(r);
 			RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
@@ -283,7 +285,11 @@
 			df.setDetectRenames(true);
 			List<DiffEntry> diffs = df.scan(parentTree, commitTree);
 			for (DiffEntry diff : diffs) {
-				list.add(new PathModel(diff.getNewPath(), diff.getNewPath(), 0, diff.getNewMode().getBits(), commit.getId().getName()));
+				if (diff.getChangeType().equals(ChangeType.DELETE)) {
+					list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
+				} else {
+					list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
+				}
 			}
 		} catch (Throwable t) {
 			LOGGER.error("failed to determine files in commit!", t);
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index ca75776..b8d31ae 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -50,4 +50,8 @@
 gb.difftocurrent = diff to current
 gb.search = search
 gb.searchForAuthor = Search for commits authored by
-gb.searchForCommitter = Search for commits committed by
\ No newline at end of file
+gb.searchForCommitter = Search for commits committed by
+gb.addition = addition
+gb.modification = modification
+gb.deletion = deletion
+gb.rename = rename
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/RepositoryPage.java b/src/com/gitblit/wicket/RepositoryPage.java
index 6442bee..979debd 100644
--- a/src/com/gitblit/wicket/RepositoryPage.java
+++ b/src/com/gitblit/wicket/RepositoryPage.java
@@ -11,6 +11,7 @@
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -146,6 +147,25 @@
 			WicketUtils.setHtmlTitle(component, getString("gb.searchForCommitter") + " " + value);
 		}
 	}
+	
+	protected void setChangeTypeTooltip(Component container, ChangeType type) {
+		switch (type) {
+		case ADD:
+			WicketUtils.setHtmlTitle(container, getString("gb.addition"));
+			break;
+		case COPY:
+		case RENAME:
+			WicketUtils.setHtmlTitle(container, getString("gb.rename"));
+			break;
+		case DELETE:
+			WicketUtils.setHtmlTitle(container, getString("gb.deletion"));
+			break;
+		case MODIFY:
+			WicketUtils.setHtmlTitle(container, getString("gb.modification"));
+			break;
+		}
+	}
+	
 	@Override
 	protected void onBeforeRender() {
 		// dispose of repository object
diff --git a/src/com/gitblit/wicket/WicketUtils.java b/src/com/gitblit/wicket/WicketUtils.java
index e474325..c8d605b 100644
--- a/src/com/gitblit/wicket/WicketUtils.java
+++ b/src/com/gitblit/wicket/WicketUtils.java
@@ -9,6 +9,7 @@
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.behavior.SimpleAttributeModifier;
 import org.apache.wicket.markup.html.basic.Label;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
 import org.eclipse.jgit.lib.Constants;
 
 import com.gitblit.GitBlit;
@@ -29,6 +30,24 @@
 
 	public static void setHtmlTitle(Component container, String value) {
 		container.add(new SimpleAttributeModifier("title", value));
+	}
+
+	public static void setChangeTypeCssClass(Component container, ChangeType type) {
+		switch (type) {
+		case ADD:
+			setCssClass(container, "addition");
+			break;
+		case COPY:
+		case RENAME:
+			setCssClass(container, "rename");
+			break;
+		case DELETE:
+			setCssClass(container, "deletion");
+			break;
+		case MODIFY:
+			setCssClass(container, "modification");
+			break;
+		}
 	}
 
 	public static void setTicketCssClass(Component container, String state) {
@@ -96,7 +115,7 @@
 
 	public static PageParameters newSearchParameter(String repositoryName, String commitId, String search, SearchType type) {
 		if (StringUtils.isEmpty(commitId)) {
-			return new PageParameters("r=" + repositoryName + ",s=" + search + ",st=" + type.name());	
+			return new PageParameters("r=" + repositoryName + ",s=" + search + ",st=" + type.name());
 		}
 		return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search + ",st=" + type.name());
 	}
diff --git a/src/com/gitblit/wicket/models/PathModel.java b/src/com/gitblit/wicket/models/PathModel.java
index e2e463f..2895d56 100644
--- a/src/com/gitblit/wicket/models/PathModel.java
+++ b/src/com/gitblit/wicket/models/PathModel.java
@@ -2,6 +2,8 @@
 
 import java.io.Serializable;
 
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
+
 import com.gitblit.utils.JGitUtils;
 
 public class PathModel implements Serializable, Comparable<PathModel> {
@@ -50,4 +52,16 @@
 		}
 		return 1;
 	}
+
+	public static class PathChangeModel extends PathModel {
+		
+		private static final long serialVersionUID = 1L;
+		
+		public final ChangeType changeType;
+
+		public PathChangeModel(String name, String path, long size, int mode, String commitId, ChangeType type) {
+			super(name, path, size, mode, commitId);
+			this.changeType = type;
+		}
+	}
 }
diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.html b/src/com/gitblit/wicket/pages/CommitDiffPage.html
index af731a0..a3a480b 100644
--- a/src/com/gitblit/wicket/pages/CommitDiffPage.html
+++ b/src/com/gitblit/wicket/pages/CommitDiffPage.html
@@ -21,6 +21,7 @@
 	<!-- changed paths -->
 	<table style="margin-top:10px;border-top:1px solid #bbb;" class="pretty">
 		<tr wicket:id="changedPath">
+			<td><span wicket:id="changeType">[change type]</span></td>		
 			<td class="path"><span wicket:id="pathName">[commit path]</span></td>			
 			<td>
 				<span class="link">
diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.java b/src/com/gitblit/wicket/pages/CommitDiffPage.java
index 87e8110..d52b7a3 100644
--- a/src/com/gitblit/wicket/pages/CommitDiffPage.java
+++ b/src/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -16,7 +16,7 @@
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.models.PathModel.PathChangeModel;
 
 public class CommitDiffPage extends RepositoryPage {
 
@@ -46,14 +46,19 @@
 		add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter()));
 
 		// changed paths list
-		List<PathModel> paths = JGitUtils.getFilesInCommit(r, commit);
-		ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
-		DataView<PathModel> pathsView = new DataView<PathModel>("changedPath", pathsDp) {
+		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);
+		ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);
+		DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
 			private static final long serialVersionUID = 1L;
 			int counter = 0;
 
-			public void populateItem(final Item<PathModel> item) {
-				final PathModel entry = item.getModelObject();
+			public void populateItem(final Item<PathChangeModel> item) {
+				final PathChangeModel entry = item.getModelObject();
+				Label changeType = new Label("changeType", "");
+				WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
+				setChangeTypeTooltip(changeType, entry.changeType);
+				item.add(changeType);
+
 				if (entry.isTree()) {
 					item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, newPathParameter(entry.path)));
 				} else {
diff --git a/src/com/gitblit/wicket/pages/CommitPage.html b/src/com/gitblit/wicket/pages/CommitPage.html
index ec1b55d..87547fc 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.html
+++ b/src/com/gitblit/wicket/pages/CommitPage.html
@@ -45,6 +45,7 @@
 	<!-- changed paths -->
 	<table style="border-top:1px solid #bbb;" class="pretty">
 		<tr wicket:id="changedPath">
+			<td><span wicket:id="changeType">[change type]</span></td>
 			<td class="path"><span wicket:id="pathName">[commit path]</span></td>			
 			<td>
 				<span class="link">
diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java
index 064a7fe..0406523 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.java
+++ b/src/com/gitblit/wicket/pages/CommitPage.java
@@ -18,7 +18,7 @@
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.models.PathModel.PathChangeModel;
 
 public class CommitPage extends RepositoryPage {
 
@@ -78,14 +78,18 @@
 		addFullText("fullMessage", c.getFullMessage(), true);
 
 		// changed paths list
-		List<PathModel> paths = JGitUtils.getFilesInCommit(r, c);
-		ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
-		DataView<PathModel> pathsView = new DataView<PathModel>("changedPath", pathsDp) {
+		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, c);
+		ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);
+		DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
 			private static final long serialVersionUID = 1L;
 			int counter = 0;
 
-			public void populateItem(final Item<PathModel> item) {
-				final PathModel entry = item.getModelObject();
+			public void populateItem(final Item<PathChangeModel> item) {
+				final PathChangeModel entry = item.getModelObject();
+				Label changeType = new Label("changeType", "");
+				WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
+				setChangeTypeTooltip(changeType, entry.changeType);
+				item.add(changeType);
 				if (entry.isTree()) {
 					item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, newPathParameter(entry.path)));
 				} else {
diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.java b/src/com/gitblit/wicket/panels/HistoryPanel.java
index dd1395a..e68fc1a 100644
--- a/src/com/gitblit/wicket/panels/HistoryPanel.java
+++ b/src/com/gitblit/wicket/panels/HistoryPanel.java
@@ -18,11 +18,12 @@
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
 import com.gitblit.utils.JGitUtils;
-import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.JGitUtils.SearchType;
+import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.PathModel;
+import com.gitblit.wicket.models.PathModel.PathChangeModel;
 import com.gitblit.wicket.pages.BlobDiffPage;
 import com.gitblit.wicket.pages.BlobPage;
 import com.gitblit.wicket.pages.CommitDiffPage;
@@ -47,7 +48,7 @@
 		}
 
 		RevCommit commit = JGitUtils.getCommit(r, objectId);
-		List<PathModel> paths = JGitUtils.getFilesInCommit(r, commit);
+		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);
 
 		PathModel matchingPath = null;
 		for (PathModel p : paths) {
diff --git a/src/com/gitblit/wicket/resources/gitblit.css b/src/com/gitblit/wicket/resources/gitblit.css
index 8264cbb..d3d68b7 100644
--- a/src/com/gitblit/wicket/resources/gitblit.css
+++ b/src/com/gitblit/wicket/resources/gitblit.css
@@ -169,7 +169,7 @@
 	color:yellow;
 	text-align:right;
 	float:right;
-	padding:3px;
+	padding:3px 4px 3px 3px;	
 }
 
 .repositories_message {
@@ -281,6 +281,31 @@
 	font-family: inherit;
 }
 
+span.addition, span.modification, span.deletion, span.rename {
+	border: 1px solid #888;
+	float: left;
+	height: 0.8em;
+	margin: 0.2em 0.5em 0 0;
+	overflow: hidden;
+	width: 0.8em;
+}
+
+span.addition {
+	background-color: #bbffbb;
+}
+
+span.modification {
+	background-color: #ffdd88;
+}
+
+span.deletion {
+	background-color: #ff8888;
+}
+
+span.rename {
+	background-color: #8888ff;
+}
+
 a.list {
 	text-decoration: none;
 	color: #000000;

--
Gitblit v1.9.1