From 4a2fb11479c9b53ffe4e2e1cca82205ca122753b Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 31 Oct 2014 09:08:37 -0400
Subject: [PATCH] Gracefully handle missing integration branch in ticket page

---
 src/main/java/com/gitblit/wicket/pages/TicketPage.html    |    1 -
 src/main/java/com/gitblit/utils/JGitUtils.java            |   18 ++++++++++++++----
 releases.moxie                                            |    4 +++-
 src/main/java/com/gitblit/wicket/pages/TicketPage.java    |   14 ++++++++++----
 src/main/java/com/gitblit/wicket/GitBlitWebApp.properties |    1 +
 5 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/releases.moxie b/releases.moxie
index 145ea77..5fead38 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -14,7 +14,8 @@
           design.
           ''
     security: ~
-    fixes: ~
+    fixes:
+    - Fix exception when viewing a ticket with a patchset where the integration branch does not exist (issue-521, ticket-212)
     changes:
     - Replaced Dagger with Guice (ticket-80)
     - Use release name as root directory in Gitblit GO artifacts (ticket-109)
@@ -37,6 +38,7 @@
     - Alex Lewis
     - Florian Zschocke
     - Paul Martin
+    - razzard
 }
 
 #
diff --git a/src/main/java/com/gitblit/utils/JGitUtils.java b/src/main/java/com/gitblit/utils/JGitUtils.java
index da51ea9..68c62ea 100644
--- a/src/main/java/com/gitblit/utils/JGitUtils.java
+++ b/src/main/java/com/gitblit/utils/JGitUtils.java
@@ -2270,7 +2270,7 @@
 	}
 
 	public static enum MergeStatus {
-		NOT_MERGEABLE, FAILED, ALREADY_MERGED, MERGEABLE, MERGED;
+		MISSING_INTEGRATION_BRANCH, MISSING_SRC_BRANCH, NOT_MERGEABLE, FAILED, ALREADY_MERGED, MERGEABLE, MERGED;
 	}
 
 	/**
@@ -2285,9 +2285,17 @@
 	public static MergeStatus canMerge(Repository repository, String src, String toBranch) {
 		RevWalk revWalk = null;
 		try {
-			revWalk = new RevWalk(repository);
-			RevCommit branchTip = revWalk.lookupCommit(repository.resolve(toBranch));
-			RevCommit srcTip = revWalk.lookupCommit(repository.resolve(src));
+			revWalk = new RevWalk(repository);
+			ObjectId branchId = repository.resolve(toBranch);
+			if (branchId == null) {
+				return MergeStatus.MISSING_INTEGRATION_BRANCH;
+			}
+			ObjectId srcId = repository.resolve(src);
+			if (srcId == null) {
+				return MergeStatus.MISSING_SRC_BRANCH;
+			}
+			RevCommit branchTip = revWalk.lookupCommit(branchId);
+			RevCommit srcTip = revWalk.lookupCommit(srcId);
 			if (revWalk.isMergedInto(srcTip, branchTip)) {
 				// already merged
 				return MergeStatus.ALREADY_MERGED;
@@ -2300,6 +2308,8 @@
 			if (canMerge) {
 				return MergeStatus.MERGEABLE;
 			}
+		} catch (NullPointerException e) {
+			LOGGER.error("Failed to determine canMerge", e);
 		} catch (IOException e) {
 			LOGGER.error("Failed to determine canMerge", e);
 		} finally {
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index 5326042..ce7b522 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -749,3 +749,4 @@
 gb.sortLowestPriority = lowest priority
 gb.sortHighestSeverity = highest severity
 gb.sortLowestSeverity = lowest severity
+gb.missingIntegrationBranchMore = The target integration branch does not exist in the repository!
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.html b/src/main/java/com/gitblit/wicket/pages/TicketPage.html
index f3c6b2a..5ae005e 100644
--- a/src/main/java/com/gitblit/wicket/pages/TicketPage.html
+++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.html
@@ -557,7 +557,6 @@
 	</div>
 </wicket:fragment>
 
-
 <!-- VETOED PATCHSET FRAGMENT -->
 <wicket:fragment wicket:id="vetoedFragment">
 	<div class="alert alert-error submit-info" style="padding:4px;">
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
index b140bfc..4890874 100644
--- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -519,10 +519,10 @@
 		 * TICKET METADATA
 		 */
 		add(new Label("ticketType", ticket.type.toString()));
-		
+
 		add(new Label("priority", ticket.priority.toString()));
 		add(new Label("severity", ticket.severity.toString()));
-		
+
 		if (StringUtils.isEmpty(ticket.topic)) {
 			add(new Label("ticketTopic").setVisible(false));
 		} else {
@@ -531,8 +531,8 @@
 			String safeTopic = app().xssFilter().relaxed(topic);
 			add(new Label("ticketTopic", safeTopic).setEscapeModelStrings(false));
 		}
-		
-		
+
+
 
 
 		/*
@@ -1431,6 +1431,12 @@
 				Fragment mergePanel = new Fragment("mergePanel", "alreadyMergedFragment", this);
 				mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetAlreadyMerged"), ticket.mergeTo)));
 				return mergePanel;
+			} else if (MergeStatus.MISSING_INTEGRATION_BRANCH == mergeStatus) {
+				// target/integration branch is missing
+				Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", this);
+				mergePanel.add(new Label("mergeTitle", MessageFormat.format(getString("gb.patchsetNotMergeable"), ticket.mergeTo)));
+				mergePanel.add(new Label("mergeMore", MessageFormat.format(getString("gb.missingIntegrationBranchMore"), ticket.mergeTo)));
+				return mergePanel;
 			} else {
 				// patchset can not be cleanly merged
 				Fragment mergePanel = new Fragment("mergePanel", "notMergeableFragment", this);

--
Gitblit v1.9.1