# HG changeset patch # User mpm@selenic.com # Date 1117653079 28800 # Node ID 48398a5353e393f682c7455d0de7d44ded965d28 # Parent 426d3c3ae3630b31ba93a692aa175cc2f4018597 commands: better argument processing, per-command help -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 commands: better argument processing, per-command help This passes command line arguments as positional arguments rather than as a list and attempt to catch exceptions if the arguments don't match up. It also adds 'hg help [cmd]' which prints the syntax and docstring for the given command. manifest hash: cef3ac7076f99fce4265a5dc7acb57fb03d93270 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCnghXywK+sNU5EO8RAv+5AJ9MfCCRxE+pNu3i44v5I4IyQoRaiQCeNqEK wBzAiP+Q6F/9PL2xOrrZGHw= =EYdk -----END PGP SIGNATURE----- diff -r 426d3c3ae363 -r 48398a5353e3 mercurial/commands.py --- a/mercurial/commands.py Wed Jun 01 10:43:11 2005 -0800 +++ b/mercurial/commands.py Wed Jun 01 11:11:19 2005 -0800 @@ -1,4 +1,4 @@ -import os, re +import os, re, traceback, sys from mercurial import fancyopts, ui, hg class UnknownCommand(Exception): pass @@ -9,7 +9,17 @@ return [ os.path.join(p, x) for x in args ] return args -def help(ui, args): +def help(ui, cmd=None): + '''show help''' + if cmd: + try: + i = find(cmd) + ui.write("%s\n\n" % i[2]) + ui.write(i[0].__doc__, "\n") + except UnknownCommand: + ui.warn("unknown command %s", cmd) + sys.exit(0) + ui.status("""\ hg commands: @@ -35,20 +45,18 @@ undo undo the last transaction """) -def init(ui, args): +def init(ui): """create a repository""" hg.repository(ui, ".", create=1) -def checkout(u, repo, args): +def checkout(u, repo, changeset=None): + '''checkout a given changeset or the current tip''' node = repo.changelog.tip() - if args: - node = repo.lookup(args[0]) + if changeset: + node = repo.lookup(changeset) repo.checkout(node) -def annotate(u, repo, args, **ops): - if not args: - return - +def annotate(u, repo, *args, **ops): def getnode(rev): return hg.short(repo.changelog.node(rev)) @@ -90,13 +98,13 @@ for p,l in zip(zip(*pieces), lines): u.write(" ".join(p) + ": " + l[1]) -def undo(ui, repo, args): +def undo(ui, repo): repo.undo() table = { "init": (init, [], 'hg init'), - "help": (help, [], 'hg help'), - "checkout|co": (checkout, [], 'hg checkout'), + "help": (help, [], 'hg help [command]'), + "checkout|co": (checkout, [], 'hg checkout [changeset]'), "ann|annotate": (annotate, [('r', 'revision', '', 'revision'), ('u', 'user', None, 'show user'), @@ -108,6 +116,14 @@ norepo = "init branch help" +def find(cmd): + i = None + for e in table.keys(): + if re.match(e + "$", cmd): + return table[e] + + raise UnknownCommand(cmd) + def dispatch(args): options = {} opts = [('v', 'verbose', None, 'verbose'), @@ -127,24 +143,27 @@ u = ui.ui(options["verbose"], options["debug"], options["quiet"], not options["noninteractive"]) - i = None - for e in table.keys(): - if re.match(e + "$", cmd): - i = table[e] - - # deal with this internally later - if not i: raise UnknownCommand(cmd) + # deal with unfound commands later + i = find(cmd) cmdoptions = {} args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) if cmd not in norepo.split(): repo = hg.repository(ui = u) - d = lambda: i[0](u, repo, args, **cmdoptions) + d = lambda: i[0](u, repo, *args, **cmdoptions) else: - d = lambda: i[0](u, args, **cmdoptions) + d = lambda: i[0](u, *args, **cmdoptions) try: d() except KeyboardInterrupt: u.warn("interrupted!\n") + except TypeError, inst: + # was this an argument error? + tb = traceback.extract_tb(sys.exc_info()[2]) + if len(tb) > 2: # no + raise + u.warn("%s: invalid arguments\n" % i[0].__name__) + u.warn("syntax: %s\n" % i[2]) + sys.exit(-1)