Implement the 'goto' command
[stgit] / stgit / main.py
index b84d91d..df4e1f5 100644 (file)
@@ -22,7 +22,7 @@ import sys, os
 from optparse import OptionParser, make_option
 
 from stgit.utils import *
-from stgit import stack, git
+from stgit import stack, git, gitmergeonefile
 from stgit.version import version
 from stgit.config import config
 from stgit.commands.common import *
@@ -39,6 +39,7 @@ import stgit.commands.commit
 import stgit.commands.export
 import stgit.commands.files
 import stgit.commands.fold
+import stgit.commands.goto
 import stgit.commands.id
 import stgit.commands.imprt
 import stgit.commands.init
@@ -54,9 +55,11 @@ import stgit.commands.rename
 import stgit.commands.resolved
 import stgit.commands.rm
 import stgit.commands.series
+import stgit.commands.show
 import stgit.commands.status
 import stgit.commands.top
 import stgit.commands.unapplied
+import stgit.commands.uncommit
 
 
 #
@@ -74,6 +77,7 @@ commands = {
     'export':   stgit.commands.export,
     'files':    stgit.commands.files,
     'fold':     stgit.commands.fold,
+    'goto':     stgit.commands.goto,
     'id':       stgit.commands.id,
     'import':   stgit.commands.imprt,
     'init':     stgit.commands.init,
@@ -89,16 +93,18 @@ commands = {
     'resolved': stgit.commands.resolved,
     'rm':       stgit.commands.rm,
     'series':   stgit.commands.series,
+    'show':     stgit.commands.show,
     'status':   stgit.commands.status,
     'top':      stgit.commands.top,
     'unapplied':stgit.commands.unapplied,
+    'uncommit': stgit.commands.uncommit,
     }
 
 def print_help():
     print 'usage: %s <command> [options]' % os.path.basename(sys.argv[0])
     print
     print 'commands:'
-    print '  help        print this message'
+    print '  help        print the detailed command usage'
     print '  version     display version information'
     print '  copyright   display copyright information'
     print
@@ -119,13 +125,34 @@ def main():
     if len(sys.argv) < 2:
         print >> sys.stderr, 'Unknown command'
         print >> sys.stderr, \
-              '  Try "%s help" for a list of supported commands' % prog
+              '  Try "%s --help" for a list of supported commands' % prog
         sys.exit(1)
 
     cmd = sys.argv[1]
 
-    if cmd in ['-h', '--help', 'help']:
-        print_help()
+    if cmd in ['-h', '--help']:
+        if len(sys.argv) == 3 and sys.argv[2] in commands:
+            cmd = sys.argv[2]
+            sys.argv[2] = '--help'
+        else:
+            print_help()
+            sys.exit(0)
+    if cmd == 'help':
+        if len(sys.argv) == 3 and not sys.argv[2] in ['-h', '--help']:
+            cmd = sys.argv[2]
+            if not cmd in commands:
+                print >> sys.stderr, '%s help: "%s" command unknown' \
+                      % (prog, cmd)
+                sys.exit(1)
+
+            sys.argv[0] += ' %s' % cmd
+            command = commands[cmd]
+            parser = OptionParser(usage = command.usage,
+                                  option_list = command.options)
+            parser.print_help()
+        else:
+            print 'usage: %s help <command>' % prog
+
         sys.exit(0)
     if cmd in ['-v', '--version', 'version']:
         print 'Stacked GIT %s' % version
@@ -146,24 +173,22 @@ def main():
     del(sys.argv[1])
 
     command = commands[cmd]
-    parser = OptionParser(usage = command.usage,
-                          option_list = command.options)
+    usage = command.usage.split('\n')[0].strip()
+    parser = OptionParser(usage = usage, option_list = command.options)
     options, args = parser.parse_args()
     try:
-        # 'clone' doesn't expect an already initialised GIT tree
-        if cmd == 'clone':
-            stgit.commands.common.crt_series = stack.Series('master')
-        elif hasattr(options, 'branch') and options.branch:
-            stgit.commands.common.crt_series = stack.Series(options.branch)
-        else:
-            stgit.commands.common.crt_series = stack.Series()
-        # the line below is a simple way to avoid an exception when
-        # stgit is run outside an initialised tree
-        setattr(command, 'crt_series', stgit.commands.common.crt_series)
+        # 'clone' doesn't expect an already initialised GIT tree. A Series
+        # object will be created after the GIT tree is cloned
+        if cmd != 'clone':
+            if hasattr(options, 'branch') and options.branch:
+                command.crt_series = stack.Series(options.branch)
+            else:
+                command.crt_series = stack.Series()
+            stgit.commands.common.crt_series = command.crt_series
 
         command.func(parser, options, args)
-    except (IOError, CmdException, stack.StackException, git.GitException), \
-               err:
+    except (IOError, CmdException, stack.StackException, git.GitException,
+            gitmergeonefile.GitMergeException), err:
         print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
         sys.exit(2)
     except KeyboardInterrupt: