Initialize TextBuiltins with the repository before execution
[egit/charleso.git] / org.spearce.jgit.pgm / src / org / spearce / jgit / pgm / Main.java
blob68748bf629e6afc98d29bd3e6bfc7240d4f9057a
1 /*
2 * Copyright (C) 2006, Robin Rosenberg <robin.rosenberg@dewire.com>
3 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
5 * All rights reserved.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
9 * conditions are met:
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
19 * - Neither the name of the Git Development Community nor the
20 * names of its contributors may be used to endorse or promote
21 * products derived from this software without specific prior
22 * written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
25 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
26 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 package org.spearce.jgit.pgm;
41 import java.io.File;
42 import java.util.Arrays;
44 import org.spearce.jgit.awtui.AwtAuthenticator;
45 import org.spearce.jgit.errors.TransportException;
46 import org.spearce.jgit.lib.Repository;
47 import org.spearce.jgit.pgm.opt.CmdLineParser;
48 import org.spearce.jgit.pgm.opt.SubcommandHandler;
49 import org.spearce.jgit.util.HttpSupport;
51 /** Command line entry point. */
52 public class Main {
53 private static boolean showStackTrace;
55 /**
56 * Execute the command line.
58 * @param argv
59 * arguments.
61 public static void main(final String[] argv) {
62 try {
63 AwtAuthenticator.install();
64 HttpSupport.configureHttpProxy();
65 execute(argv);
66 } catch (Die err) {
67 System.err.println("fatal: " + err.getMessage());
68 if (showStackTrace)
69 err.printStackTrace();
70 System.exit(128);
71 } catch (Exception err) {
72 if (!showStackTrace && err.getCause() != null
73 && err instanceof TransportException)
74 System.err.println("fatal: " + err.getCause().getMessage());
76 if (err.getClass().getName().startsWith("org.spearce.jgit.errors.")) {
77 System.err.println("fatal: " + err.getMessage());
78 if (showStackTrace)
79 err.printStackTrace();
80 System.exit(128);
82 err.printStackTrace();
83 System.exit(1);
87 private static void execute(final String[] argv) throws Exception {
88 int argi = 0;
90 File gitdir = null;
91 for (; argi < argv.length; argi++) {
92 final String arg = argv[argi];
93 if (arg.startsWith("--git-dir="))
94 gitdir = new File(arg.substring("--git-dir=".length()));
95 else if (arg.equals("--show-stack-trace"))
96 showStackTrace = true;
97 else if (arg.startsWith("--"))
98 usage();
99 else
100 break;
103 if (argi == argv.length)
104 usage();
105 if (gitdir == null)
106 gitdir = findGitDir();
107 if (gitdir == null || !gitdir.isDirectory()) {
108 System.err.println("error: can't find git directory");
109 System.exit(1);
112 final TextBuiltin cmd = createCommand(argv[argi++]);
113 cmd.init(new Repository(gitdir));
114 try {
115 cmd.execute(subarray(argv, argi));
116 } finally {
117 if (cmd.out != null)
118 cmd.out.flush();
122 private static File findGitDir() {
123 File current = new File(".").getAbsoluteFile();
124 while (current != null) {
125 final File gitDir = new File(current, ".git");
126 if (gitDir.isDirectory())
127 return gitDir;
128 current = current.getParentFile();
130 return null;
133 private static String[] subarray(final String[] argv, final int i) {
134 return Arrays.asList(argv).subList(i, argv.length).toArray(
135 new String[0]);
138 private static TextBuiltin createCommand(final String name) {
139 final StringBuilder s = new StringBuilder();
140 s.append(mypackage());
141 s.append('.');
142 boolean upnext = true;
143 for (int i = 0; i < name.length(); i++) {
144 final char c = name.charAt(i);
145 if (c == '-') {
146 upnext = true;
147 continue;
149 if (upnext)
150 s.append(Character.toUpperCase(c));
151 else
152 s.append(c);
153 upnext = false;
155 try {
156 return (TextBuiltin) Class.forName(s.toString()).newInstance();
157 } catch (Exception e) {
158 System.err.println("error: " + name + " is not a jgit command.");
159 System.exit(1);
160 return null;
164 private static String mypackage() {
165 final String p = Main.class.getName();
166 final int dot = p.lastIndexOf('.');
167 return p.substring(0, dot);
170 private static void usage() {
171 System.err.println("jgit [--git-dir=path] cmd ...");
172 System.exit(1);