Add support to hide and unhide patches
[stgit] / stgit / main.py
index c2797c9..8694acd 100644 (file)
@@ -30,7 +30,27 @@ class Commands(dict):
     """Commands class. It performs on-demand module loading
     """
     def __getitem__(self, key):
     """Commands class. It performs on-demand module loading
     """
     def __getitem__(self, key):
+        """Return the command python module name based.
+        """
+        global prog
+
         cmd_mod = self.get(key)
         cmd_mod = self.get(key)
+        if not cmd_mod:
+            candidates = [cmd for cmd in self.keys() if cmd.startswith(key)]
+
+            if not candidates:
+                print >> sys.stderr, 'Unknown command: %s' % key
+                print >> sys.stderr, '  Try "%s help" for a list of ' \
+                      'supported commands' % prog
+                sys.exit(1)
+            elif len(candidates) > 1:
+                print >> sys.stderr, 'Ambiguous command: %s' % key
+                print >> sys.stderr, '  Candidates are: %s' \
+                      % ', '.join(candidates)
+                sys.exit(1)
+
+            cmd_mod = self.get(candidates[0])
+            
         __import__('stgit.commands.' + cmd_mod)
         return getattr(stgit.commands, cmd_mod)
 
         __import__('stgit.commands.' + cmd_mod)
         return getattr(stgit.commands, cmd_mod)
 
@@ -49,6 +69,7 @@ commands = Commands({
     'float':            'float',
     'fold':             'fold',
     'goto':             'goto',
     'float':            'float',
     'fold':             'fold',
     'goto':             'goto',
+    'hide':             'hide',
     'id':               'id',
     'import':           'imprt',
     'init':             'init',
     'id':               'id',
     'import':           'imprt',
     'init':             'init',
@@ -60,6 +81,7 @@ commands = Commands({
     'pop':              'pop',
     'pull':             'pull',
     'push':             'push',
     'pop':              'pop',
     'pull':             'pull',
     'push':             'push',
+    'rebase':           'rebase',
     'refresh':          'refresh',
     'rename':           'rename',
     'resolved':         'resolved',
     'refresh':          'refresh',
     'rename':           'rename',
     'resolved':         'resolved',
@@ -67,9 +89,11 @@ commands = Commands({
     'series':           'series',
     'show':             'show',
     'status':           'status',
     'series':           'series',
     'show':             'show',
     'status':           'status',
+    'sync':             'sync',
     'top':              'top',
     'unapplied':        'unapplied',
     'top':              'top',
     'unapplied':        'unapplied',
-    'uncommit':         'uncommit'
+    'uncommit':         'uncommit',
+    'unhide':           'unhide'
     })
 
 # classification: repository, stack, patch, working copy
     })
 
 # classification: repository, stack, patch, working copy
@@ -86,13 +110,16 @@ stackcommands = (
     'commit',
     'float',
     'goto',
     'commit',
     'float',
     'goto',
+    'hide',
     'init',
     'pop',
     'push',
     'init',
     'pop',
     'push',
+    'rebase',
     'series',
     'top',
     'unapplied',
     'series',
     'top',
     'unapplied',
-    'uncommit'
+    'uncommit',
+    'unhide'
     )
 patchcommands = (
     'delete',
     )
 patchcommands = (
     'delete',
@@ -106,7 +133,8 @@ patchcommands = (
     'pick',
     'refresh',
     'rename',
     'pick',
     'refresh',
     'rename',
-    'show'
+    'show',
+    'sync'
     )
 wccommands = (
     'add',
     )
 wccommands = (
     'add',
@@ -161,6 +189,8 @@ def print_help():
 def main():
     """The main function
     """
 def main():
     """The main function
     """
+    global prog
+
     prog = os.path.basename(sys.argv[0])
 
     if len(sys.argv) < 2:
     prog = os.path.basename(sys.argv[0])
 
     if len(sys.argv) < 2:
@@ -190,7 +220,8 @@ def main():
             command = commands[cmd]
             parser = OptionParser(usage = command.usage,
                                   option_list = command.options)
             command = commands[cmd]
             parser = OptionParser(usage = command.usage,
                                   option_list = command.options)
-            parser.print_help()
+            from pydoc import pager
+            pager(parser.format_help())
         else:
             print_help()
         sys.exit(0)
         else:
             print_help()
         sys.exit(0)
@@ -203,11 +234,6 @@ def main():
     if cmd in ['copyright']:
         print __copyright__
         sys.exit(0)
     if cmd in ['copyright']:
         print __copyright__
         sys.exit(0)
-    if not cmd in commands:
-        print >> sys.stderr, 'Unknown command: %s' % cmd
-        print >> sys.stderr, '  Try "%s help" for a list of supported ' \
-              'commands' % prog
-        sys.exit(1)
 
     # re-build the command line arguments
     sys.argv[0] += ' %s' % cmd
 
     # re-build the command line arguments
     sys.argv[0] += ' %s' % cmd
@@ -221,7 +247,7 @@ def main():
     # These modules are only used from this point onwards and do not
     # need to be imported earlier
     from stgit.config import config_setup
     # These modules are only used from this point onwards and do not
     # need to be imported earlier
     from stgit.config import config_setup
-    from ConfigParser import ParsingError
+    from ConfigParser import ParsingError, NoSectionError
     from stgit.stack import Series, StackException
     from stgit.git import GitException
     from stgit.commands.common import CmdException
     from stgit.stack import Series, StackException
     from stgit.git import GitException
     from stgit.commands.common import CmdException
@@ -240,8 +266,8 @@ def main():
             stgit.commands.common.crt_series = command.crt_series
 
         command.func(parser, options, args)
             stgit.commands.common.crt_series = command.crt_series
 
         command.func(parser, options, args)
-    except (IOError, ParsingError, CmdException, StackException, GitException,
-            GitMergeException), err:
+    except (IOError, ParsingError, NoSectionError, CmdException,
+            StackException, GitException, GitMergeException), err:
         print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
         sys.exit(2)
     except KeyboardInterrupt:
         print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
         sys.exit(2)
     except KeyboardInterrupt: