From ce119acc6dbb3153af1cbbf7ec1270d21f5e52c8 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 17 Apr 2011 16:10:38 -0400
Subject: [PATCH] patch-to-current feature.

---
 src/com/gitblit/wicket/pages/PatchPage.java    |   10 +++++++++-
 src/com/gitblit/wicket/pages/BlobDiffPage.java |    3 ++-
 src/com/gitblit/utils/JGitUtils.java           |   19 ++++++++++++++-----
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 9b2e37c..5590ffe 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -362,16 +362,25 @@
 	}
 
 	public static String getCommitPatch(Repository r, RevCommit commit, String path) {
+		return getCommitPatch(r, null, commit, path);
+	}
+	
+	public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit, String path) {
 		try {
-			final RevWalk rw = new RevWalk(r);
-			RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
-			RevTree parentTree = parent.getTree();
+			RevTree baseTree;
+			if (baseCommit == null) {
+				final RevWalk rw = new RevWalk(r);
+				RevCommit parent = rw.parseCommit(commit.getParent(0).getId());
+				baseTree = parent.getTree();
+			} else {
+				baseTree = baseCommit.getTree();
+			}
 			RevTree commitTree = commit.getTree();
 
 			final TreeWalk walk = new TreeWalk(r);
 			walk.reset();
 			walk.setRecursive(true);
-			walk.addTree(parentTree);
+			walk.addTree(baseTree);
 			walk.addTree(commitTree);
 			walk.setFilter(TreeFilter.ANY_DIFF);
 
@@ -381,7 +390,7 @@
 			df.setRepository(r);
 			df.setDiffComparator(cmp);
 			df.setDetectRenames(true);
-			List<DiffEntry> diffs = df.scan(parentTree, commitTree);
+			List<DiffEntry> diffs = df.scan(baseTree, commitTree);
 			if (path != null && path.length() > 0) {
 				for (DiffEntry diff : diffs) {
 					if (diff.getNewPath().equalsIgnoreCase(path)) {
diff --git a/src/com/gitblit/wicket/pages/BlobDiffPage.java b/src/com/gitblit/wicket/pages/BlobDiffPage.java
index bff46b3..bb47171 100644
--- a/src/com/gitblit/wicket/pages/BlobDiffPage.java
+++ b/src/com/gitblit/wicket/pages/BlobDiffPage.java
@@ -28,13 +28,14 @@
 		if (StringUtils.isEmpty(baseObjectId)) {
 			// use first parent
 			diff = JGitUtils.getCommitDiff(r, commit, blobPath, true);
+			add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
 		} else {
 			// base commit specified
 			RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);
 			diff = JGitUtils.getCommitDiff(r, baseCommit, commit, blobPath, true);
+			add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newBlobDiffParameter(repositoryName, baseObjectId, objectId, blobPath)));
 		}
 		
-		add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
 		add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
 		add(new BookmarkablePageLink<Void>("commitDiffLink", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
 
diff --git a/src/com/gitblit/wicket/pages/PatchPage.java b/src/com/gitblit/wicket/pages/PatchPage.java
index 12e89a6..45c1bf5 100644
--- a/src/com/gitblit/wicket/pages/PatchPage.java
+++ b/src/com/gitblit/wicket/pages/PatchPage.java
@@ -11,6 +11,7 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.utils.JGitUtils;
+import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.WicketUtils;
 
 public class PatchPage extends WebPage {
@@ -23,6 +24,7 @@
 			redirectToInterceptPage(new RepositoriesPage());
 		}
 		final String repositoryName = WicketUtils.getRepositoryName(params);
+		final String baseObjectId = WicketUtils.getBaseObjectId(params);
 		final String objectId = WicketUtils.getObject(params);
 		final String blobPath = WicketUtils.getPath(params);
 
@@ -38,7 +40,13 @@
 		}
 
 		RevCommit commit = JGitUtils.getCommit(r, objectId);
-		String patch = JGitUtils.getCommitPatch(r, commit, blobPath);
+		String patch;
+		if (StringUtils.isEmpty(baseObjectId)) {
+			patch = JGitUtils.getCommitPatch(r, commit, blobPath);
+		} else {
+			RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);
+			patch = JGitUtils.getCommitPatch(r, baseCommit, commit, blobPath);			
+		}
 		add(new Label("patchText", patch));
 		r.close();
 	}

--
Gitblit v1.9.1