2 * Copyright (C) 2006, Robin Rosenberg <robin.rosenberg@dewire.com>
3 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
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
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
;
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. */
53 private static boolean showStackTrace
;
56 * Execute the command line.
61 public static void main(final String
[] argv
) {
63 AwtAuthenticator
.install();
64 HttpSupport
.configureHttpProxy();
67 System
.err
.println("fatal: " + err
.getMessage());
69 err
.printStackTrace();
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());
79 err
.printStackTrace();
82 err
.printStackTrace();
87 private static void execute(final String
[] argv
) throws Exception
{
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("--"))
103 if (argi
== argv
.length
)
106 gitdir
= findGitDir();
107 if (gitdir
== null || !gitdir
.isDirectory()) {
108 System
.err
.println("error: can't find git directory");
112 final TextBuiltin cmd
= createCommand(argv
[argi
++]);
113 cmd
.init(new Repository(gitdir
));
115 cmd
.execute(subarray(argv
, argi
));
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())
128 current
= current
.getParentFile();
133 private static String
[] subarray(final String
[] argv
, final int i
) {
134 return Arrays
.asList(argv
).subList(i
, argv
.length
).toArray(
138 private static TextBuiltin
createCommand(final String name
) {
139 final StringBuilder s
= new StringBuilder();
140 s
.append(mypackage());
142 boolean upnext
= true;
143 for (int i
= 0; i
< name
.length(); i
++) {
144 final char c
= name
.charAt(i
);
150 s
.append(Character
.toUpperCase(c
));
156 return (TextBuiltin
) Class
.forName(s
.toString()).newInstance();
157 } catch (Exception e
) {
158 System
.err
.println("error: " + name
+ " is not a jgit command.");
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 ...");