Move ServiceMayNotContinueException handling code from sendPack

All other exceptions are handled in a wrapped sendPack method.
Consolidate the error handling code.

Change-Id: Ieac0ce64960534d009d1e6b025130b021b744794
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 52d2ed1..37ecead 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -2078,12 +2078,22 @@ private void sendPack(PackStatistics.Accumulator accumulator,
 			try {
 				sendPack(true, req, accumulator, allTags, unshallowCommits,
 						deepenNots);
-			} catch (ServiceMayNotContinueException noPack) {
-				// This was already reported on (below).
-				throw noPack;
+			} catch (ServiceMayNotContinueException err) {
+				String message = err.getMessage();
+				if (message == null) {
+					message = JGitText.get().internalServerError;
+				}
+				try {
+					reportInternalServerErrorOverSideband(message);
+				} catch (IOException e) {
+					err.addSuppressed(e);
+					throw err;
+				}
+				throw new UploadPackInternalServerErrorException(err);
 			} catch (IOException | RuntimeException | Error err) {
 				try {
-					reportInternalServerErrorOverSideband();
+					reportInternalServerErrorOverSideband(
+							JGitText.get().internalServerError);
 				} catch (IOException e) {
 					err.addSuppressed(e);
 					throw err;
@@ -2095,12 +2105,13 @@ private void sendPack(PackStatistics.Accumulator accumulator,
 		}
 	}
 
-	private void reportInternalServerErrorOverSideband() throws IOException {
+	private void reportInternalServerErrorOverSideband(String message)
+			throws IOException {
 		@SuppressWarnings("resource" /* java 7 */)
 		SideBandOutputStream err = new SideBandOutputStream(
 				SideBandOutputStream.CH_ERROR, SideBandOutputStream.SMALL_BUF,
 				rawOut);
-		err.write(Constants.encode(JGitText.get().internalServerError));
+		err.write(Constants.encode(message));
 		err.flush();
 	}
 
@@ -2147,25 +2158,12 @@ private void sendPack(final boolean sideband,
 			}
 		}
 
-		try {
-			if (wantAll.isEmpty()) {
-				preUploadHook.onSendPack(this, wantIds, commonBase);
-			} else {
-				preUploadHook.onSendPack(this, wantAll, commonBase);
-			}
-			msgOut.flush();
-		} catch (ServiceMayNotContinueException noPack) {
-			if (sideband && noPack.getMessage() != null) {
-				noPack.setOutput();
-				@SuppressWarnings("resource" /* java 7 */)
-				SideBandOutputStream err = new SideBandOutputStream(
-						SideBandOutputStream.CH_ERROR,
-						SideBandOutputStream.SMALL_BUF, rawOut);
-				err.write(Constants.encode(noPack.getMessage()));
-				err.flush();
-			}
-			throw noPack;
+		if (wantAll.isEmpty()) {
+			preUploadHook.onSendPack(this, wantIds, commonBase);
+		} else {
+			preUploadHook.onSendPack(this, wantAll, commonBase);
 		}
+		msgOut.flush();
 
 		PackConfig cfg = packConfig;
 		if (cfg == null)