some upgrade of command handling
authorAlexander Solovyov <piranha@piranha.org.ua>
Mon, 22 Jun 2009 23:31:07 +0300
changeset 13 c1857739143c
parent 12 f1590d2363ff
child 14 4d1b80fd0e28
some upgrade of command handling
fancycmd.py
--- a/fancycmd.py	Sat Jun 20 17:00:54 2009 +0300
+++ b/fancycmd.py	Mon Jun 22 23:31:07 2009 +0300
@@ -1,34 +1,39 @@
 import sys, traceback, getopt
+from itertools import imap
 
-from fancyopts import parse
+from fancyopts import parse, cmd_help
 
-def help_(ui, header, cmdtable, globalopts, name=None):
+def help_(ui, cmdtable, globalopts, name=None):
     def helplist():
         hlp = {}
+        # determine if there any command marked for shortlist
+        shortlist = (name == 'shortlist' and
+                     any(imap(lambda x: x.startswith('^'), cmdtable)))
+
         for cmd, info in cmdtable.items():
-            # TODO: Handle situation when there is no
-            # commands starting with '^'!
-            if name == 'shortlist' and not cmd.startswith('^'):
+            if shortlist and not cmd.startswith('^'):
                 continue # short help contains only marked commands
             cmd = cmd.lstrip('^')
             doc = info[0].__doc__ or '(no help text available)'
             hlp[cmd] = doc.splitlines()[0].rstrip()
 
-        ui.status(header)
-        hlp = sorted(hlp)
-        maxlen = max(map(len, hlp))
-        for cmd, doc in hlp.items():
+        hlplist = sorted(hlp)
+        maxlen = max(map(len, hlplist))
+        for cmd in hlplist:
+            doc = hlp[cmd]
             if ui.verbose:
                 ui.write(' %s:\n     %s\n' % (cmd.replace('|', ', '), doc))
             else:
                 ui.write(' %-*s  %s\n' % (maxlen, cmd.split('|', 1)[0], doc))
 
     if not cmdtable:
-        ui.warn('No commands specified!\n')
-        return
+        return ui.warn('No commands specified!\n')
 
     if not name or name == 'shortlist':
-        helplist()
+        return helplist()
+
+    cmd, options, usage = cmdtable[name]
+    return cmd_help(cmd, name + ': ' + usage, options)
 
 
 def dispatch(args, cmdtable, globalopts=None):
@@ -55,24 +60,22 @@
 
     ui = UI()
     if not globalopts:
-        globalopts = [('h', 'help', False, 'display help')]
+        globalopts = [
+            ('h', 'help', False, 'display help'),
+            ('', 'traceback', False, 'display full traceback on error')]
 
     try:
         return _dispatch(ui, args, cmdtable, globalopts + UI.options)
     except Abort, e:
-        ui.warn('abort: %s' % e)
+        ui.warn('abort: %s\n' % e)
     except UnknownCommand, e:
-        ui.warn("unknown command: '%s'" % e)
+        ui.warn("unknown command: '%s'\n" % e)
     except AmbiguousCommand, e:
         ui.warn("command '%s' is ambiguous:\n    %s\n" %
                 (e.args[0], ' '.join(e.args[1])))
     except ParseError, e:
-        if e.args[0]:
-            ui.warn('%s: %s' % (e.args[0], e.args[1]))
-            # display help here?
-        else:
-            ui.warn("%s\n" % e.args[1])
-            help_(ui, 'Preved', cmdtable, globalopts, 'shortlist')
+        ui.warn('%s: %s\n' % (e.args[0], e.args[1]))
+        help_(ui, cmdtable, globalopts, e.args[0])
     except KeyboardInterrupt:
         ui.warn('interrupted!\n')
     except:
@@ -91,8 +94,7 @@
     if globaloptions['help']:
         pass # help
     elif not cmd:
-        import ipdb; ipdb.set_trace()
-        return help_(ui, '', cmdtable, globalopts, 'shortlist')
+        return help_(ui, cmdtable, globalopts, 'shortlist')
 
     try:
         return func(ui, *args, **options)