X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/c333afcf5feb13f23746410a14aa9d42efc9ff01..514dd4f2a4bc2cb0fb2e160f254804361486f3df:/stgit/main.py diff --git a/stgit/main.py b/stgit/main.py index d0e7230..99e0832 100644 --- a/stgit/main.py +++ b/stgit/main.py @@ -22,10 +22,6 @@ import sys, os from optparse import OptionParser import stgit.commands -from stgit.stack import Series, StackException -from stgit.git import GitException -from stgit.commands.common import CmdException -from stgit.gitmergeonefile import GitMergeException # # The commands map @@ -34,7 +30,27 @@ class Commands(dict): """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) + 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) @@ -71,6 +87,7 @@ commands = Commands({ 'series': 'series', 'show': 'show', 'status': 'status', + 'sync': 'sync', 'top': 'top', 'unapplied': 'unapplied', 'uncommit': 'uncommit' @@ -110,7 +127,8 @@ patchcommands = ( 'pick', 'refresh', 'rename', - 'show' + 'show', + 'sync' ) wccommands = ( 'add', @@ -165,6 +183,8 @@ def print_help(): def main(): """The main function """ + global prog + prog = os.path.basename(sys.argv[0]) if len(sys.argv) < 2: @@ -194,7 +214,8 @@ def main(): 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) @@ -207,11 +228,6 @@ def main(): 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 @@ -221,7 +237,19 @@ def main(): usage = command.usage.split('\n')[0].strip() parser = OptionParser(usage = usage, option_list = command.options) options, args = parser.parse_args() + + # 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, NoSectionError + from stgit.stack import Series, StackException + from stgit.git import GitException + from stgit.commands.common import CmdException + from stgit.gitmergeonefile import GitMergeException + try: + config_setup() + # 'clone' doesn't expect an already initialised GIT tree. A Series # object will be created after the GIT tree is cloned if cmd != 'clone': @@ -232,8 +260,8 @@ def main(): stgit.commands.common.crt_series = command.crt_series command.func(parser, options, args) - except (IOError, 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: