aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2010-10-17 18:21:49 -0400
committerCode Review <codereview-daemon@eclipse.org>2010-10-17 18:21:49 -0400
commitdc5027dcef6f7f3753ed41469b18f264e3bcc791 (patch)
tree58d85dd1b2534a18096b911696a35195a462cf28
parent609c6dc3580653516038b4d677bfb2e735fd641f (diff)
parent0b51a4568835e95fe2fc88f9458d4a7368a9c691 (diff)
downloadjgit-dc5027dcef6f7f3753ed41469b18f264e3bcc791.tar.gz
jgit-dc5027dcef6f7f3753ed41469b18f264e3bcc791.zip
Merge "Allow pgm Main to be extended"
-rw-r--r--org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java72
1 files changed, 51 insertions, 21 deletions
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 ab11062cc2..ca3960e97b 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
@@ -45,6 +45,7 @@
package org.eclipse.jgit.pgm;
import java.io.File;
+import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
@@ -56,6 +57,7 @@ import java.util.List;
import org.eclipse.jgit.awtui.AwtAuthenticator;
import org.eclipse.jgit.awtui.AwtSshSessionFactory;
import org.eclipse.jgit.errors.TransportException;
+import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder;
import org.eclipse.jgit.pgm.opt.CmdLineParser;
import org.eclipse.jgit.pgm.opt.SubcommandHandler;
@@ -74,7 +76,7 @@ public class Main {
private boolean showStackTrace;
@Option(name = "--git-dir", metaVar = "metaVar_gitDir", usage = "usage_setTheGitRepositoryToOperateOn")
- private File gitdir;
+ private String gitdir;
@Argument(index = 0, metaVar = "metaVar_command", required = true, handler = SubcommandHandler.class)
private TextBuiltin subcommand;
@@ -89,27 +91,46 @@ public class Main {
* arguments.
*/
public static void main(final String[] argv) {
- final Main me = new Main();
+ new Main().run(argv);
+ }
+
+ /**
+ * Parse the command line and execute the requested action.
+ *
+ * Subclasses should allocate themselves and then invoke this method:
+ *
+ * <pre>
+ * class ExtMain {
+ * public static void main(String[] argv) {
+ * new ExtMain().run(argv);
+ * }
+ * }
+ * </pre>
+ *
+ * @param argv
+ * arguments.
+ */
+ protected void run(final String[] argv) {
try {
if (!installConsole()) {
AwtAuthenticator.install();
AwtSshSessionFactory.install();
}
configureHttpProxy();
- me.execute(argv);
+ execute(argv);
} catch (Die err) {
System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
- if (me.showStackTrace)
+ if (showStackTrace)
err.printStackTrace();
System.exit(128);
} catch (Exception err) {
- if (!me.showStackTrace && err.getCause() != null
+ if (!showStackTrace && err.getCause() != null
&& err instanceof TransportException)
System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getCause().getMessage()));
if (err.getClass().getName().startsWith("org.eclipse.jgit.errors.")) {
System.err.println(MessageFormat.format(CLIText.get().fatalError, err.getMessage()));
- if (me.showStackTrace)
+ if (showStackTrace)
err.printStackTrace();
System.exit(128);
}
@@ -162,21 +183,10 @@ public class Main {
}
final TextBuiltin cmd = subcommand;
- if (cmd.requiresRepository()) {
- RepositoryBuilder rb = new RepositoryBuilder() //
- .setGitDir(gitdir) //
- .readEnvironment() //
- .findGitDir();
- if (rb.getGitDir() == null) {
- writer.println(CLIText.get().cantFindGitDirectory);
- writer.flush();
- System.exit(1);
- }
-
- cmd.init(rb.build(), null);
- } else {
- cmd.init(null, gitdir);
- }
+ if (cmd.requiresRepository())
+ cmd.init(openGitDir(gitdir), null);
+ else
+ cmd.init(null, gitdir != null ? new File(gitdir) : null);
try {
cmd.execute(arguments.toArray(new String[arguments.size()]));
} finally {
@@ -185,6 +195,26 @@ public class Main {
}
}
+ /**
+ * Evaluate the {@code --git-dir} option and open the repository.
+ *
+ * @param gitdir
+ * the {@code --git-dir} option given on the command line. May be
+ * null if it was not supplied.
+ * @return the repository to operate on.
+ * @throws IOException
+ * the repository cannot be opened.
+ */
+ protected Repository openGitDir(String gitdir) throws IOException {
+ RepositoryBuilder rb = new RepositoryBuilder() //
+ .setGitDir(gitdir != null ? new File(gitdir) : null) //
+ .readEnvironment() //
+ .findGitDir();
+ if (rb.getGitDir() == null)
+ throw new Die(CLIText.get().cantFindGitDirectory);
+ return rb.build();
+ }
+
private static boolean installConsole() {
try {
install("org.eclipse.jgit.console.ConsoleAuthenticator");