From 977596b209866d52aee2f12f722403e367bc7ebd Mon Sep 17 00:00:00 2001
From: Guillaume Nodet <gnodet@gmail.com>
Date: Fri, 21 Mar 2014 15:53:44 +0100
Subject: Avoid calls to System.exit() and throw an exception instead

The exception is caught in Main and System.exit() is called.

Bug: 413522
Change-Id: Ibe68f7104d4fd55b832000a7840c07a169e7dd58
Signed-off-by: Guillaume Nodet <gnodet@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
---
 .../src/org/eclipse/jgit/pgm/Die.java              | 23 ++++++++++++++++++++++
 .../src/org/eclipse/jgit/pgm/Main.java             |  2 ++
 .../src/org/eclipse/jgit/pgm/TextBuiltin.java      | 14 +++++++++++--
 3 files changed, 37 insertions(+), 2 deletions(-)

(limited to 'org.eclipse.jgit.pgm')

diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
index a2f4060821..f07df1a4b5 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Die.java
@@ -54,6 +54,8 @@ package org.eclipse.jgit.pgm;
 public class Die extends RuntimeException {
 	private static final long serialVersionUID = 1L;
 
+	private boolean aborted;
+
 	/**
 	 * Construct a new message explaining what has gone wrong.
 	 *
@@ -75,4 +77,25 @@ public class Die extends RuntimeException {
 	public Die(final String why, final Throwable cause) {
 		super(why, cause);
 	}
+
+	/**
+	 * Construct a new exception reflecting the fact that the
+	 * command execution has been aborted before running.
+	 *
+	 * @param aborted boolean indicating the fact the execution has been aborted
+	 * @since 3.4
+	 */
+	public Die(boolean aborted) {
+		this.aborted = aborted;
+	}
+
+	/**
+	 * Check if this exception should cause the execution to be aborted.
+	 *
+	 * @return boolean indicating that the execution should be aborted
+	 * @since 3.4
+	 */
+	public boolean isAborted() {
+		return aborted;
+	}
 }
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
index 3648ffd8e4..94591393af 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java
@@ -123,6 +123,8 @@ public class Main {
 			configureHttpProxy();
 			execute(argv);
 		} catch (Die err) {
+			if (err.isAborted())
+				System.exit(1);
 			System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
 			if (showStackTrace)
 				err.printStackTrace();
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
index 3308fda0e3..8e8b82fe07 100644
--- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
+++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/TextBuiltin.java
@@ -227,7 +227,7 @@ public abstract class TextBuiltin {
 		} catch (CmdLineException err) {
 			if (!help) {
 				this.errw.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
-				System.exit(1);
+				throw die(true);
 			}
 		}
 
@@ -267,7 +267,7 @@ public abstract class TextBuiltin {
 		errw.println();
 
 		errw.flush();
-		System.exit(1);
+		throw die(true);
 	}
 
 	/**
@@ -324,6 +324,16 @@ public abstract class TextBuiltin {
 		return new Die(why, cause);
 	}
 
+	/**
+	 * @param aborted
+	 *            boolean indicating that the execution has been aborted before running
+	 * @return a runtime exception the caller is expected to throw
+	 * @since 3.4
+	 */
+	protected static Die die(boolean aborted) {
+		return new Die(aborted);
+	}
+
 	String abbreviateRef(String dst, boolean abbreviateRemote) {
 		if (dst.startsWith(R_HEADS))
 			dst = dst.substring(R_HEADS.length());
-- 
cgit v1.2.3