commands: better argument processing, per-command help
authormpm@selenic.com
Wed, 01 Jun 2005 11:11:19 -0800
changeset 212 48398a5353e3
parent 211 426d3c3ae363
child 213 d2172916ef6c
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-----
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)