Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/commands.py @ 2553:5b426676f616
help: make "hg help EXTENSION" work
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Mon, 03 Jul 2006 14:30:24 -0700 |
parents | e1831f06eef1 |
children | 2748253b49c2 |
comparison
equal
deleted
inserted
replaced
2552:bb403d427974 | 2553:5b426676f616 |
---|---|
532 "This is free software; see the source for copying conditions. " | 532 "This is free software; see the source for copying conditions. " |
533 "There is NO\nwarranty; " | 533 "There is NO\nwarranty; " |
534 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" | 534 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" |
535 )) | 535 )) |
536 | 536 |
537 def help_(ui, cmd=None, with_version=False): | 537 def help_(ui, name=None, with_version=False): |
538 """show help for a given command or all commands""" | 538 """show help for a command, extension, or list of commands |
539 | |
540 With no arguments, print a list of commands and short help. | |
541 | |
542 Given a command name, print help for that command. | |
543 | |
544 Given an extension name, print help for that extension, and the | |
545 commands it provides.""" | |
539 option_lists = [] | 546 option_lists = [] |
540 if cmd and cmd != 'shortlist': | 547 |
548 def helpcmd(name): | |
541 if with_version: | 549 if with_version: |
542 show_version(ui) | 550 show_version(ui) |
543 ui.write('\n') | 551 ui.write('\n') |
544 aliases, i = find(cmd) | 552 aliases, i = findcmd(name) |
545 # synopsis | 553 # synopsis |
546 ui.write("%s\n\n" % i[2]) | 554 ui.write("%s\n\n" % i[2]) |
547 | 555 |
548 # description | 556 # description |
549 doc = i[0].__doc__ | 557 doc = i[0].__doc__ |
559 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:])) | 567 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:])) |
560 | 568 |
561 # options | 569 # options |
562 if i[1]: | 570 if i[1]: |
563 option_lists.append(("options", i[1])) | 571 option_lists.append(("options", i[1])) |
564 | 572 |
565 else: | 573 def helplist(select=None): |
566 # program name | |
567 if ui.verbose or with_version: | |
568 show_version(ui) | |
569 else: | |
570 ui.status(_("Mercurial Distributed SCM\n")) | |
571 ui.status('\n') | |
572 | |
573 # list of commands | |
574 if cmd == "shortlist": | |
575 ui.status(_('basic commands (use "hg help" ' | |
576 'for the full list or option "-v" for details):\n\n')) | |
577 elif ui.verbose: | |
578 ui.status(_('list of commands:\n\n')) | |
579 else: | |
580 ui.status(_('list of commands (use "hg help -v" ' | |
581 'to show aliases and global options):\n\n')) | |
582 | |
583 h = {} | 574 h = {} |
584 cmds = {} | 575 cmds = {} |
585 for c, e in table.items(): | 576 for c, e in table.items(): |
586 f = c.split("|")[0] | 577 f = c.split("|", 1)[0] |
587 if cmd == "shortlist" and not f.startswith("^"): | 578 if select and not select(f): |
579 continue | |
580 if name == "shortlist" and not f.startswith("^"): | |
588 continue | 581 continue |
589 f = f.lstrip("^") | 582 f = f.lstrip("^") |
590 if not ui.debugflag and f.startswith("debug"): | 583 if not ui.debugflag and f.startswith("debug"): |
591 continue | 584 continue |
592 doc = e[0].__doc__ | 585 doc = e[0].__doc__ |
602 if ui.verbose: | 595 if ui.verbose: |
603 commands = cmds[f].replace("|",", ") | 596 commands = cmds[f].replace("|",", ") |
604 ui.write(" %s:\n %s\n"%(commands, h[f])) | 597 ui.write(" %s:\n %s\n"%(commands, h[f])) |
605 else: | 598 else: |
606 ui.write(' %-*s %s\n' % (m, f, h[f])) | 599 ui.write(' %-*s %s\n' % (m, f, h[f])) |
600 | |
601 def helpext(name): | |
602 try: | |
603 mod = findext(name) | |
604 except KeyError: | |
605 raise UnknownCommand(name) | |
606 | |
607 doc = (mod.__doc__ or _('No help text available')).splitlines(0) | |
608 ui.write(_('%s extension - %s\n') % (name.split('.')[-1], doc[0])) | |
609 for d in doc[1:]: | |
610 ui.write(d, '\n') | |
611 | |
612 ui.status('\n') | |
613 if ui.verbose: | |
614 ui.status(_('list of commands:\n\n')) | |
615 else: | |
616 ui.status(_('list of commands (use "hg help -v %s" ' | |
617 'to show aliases and global options):\n\n') % name) | |
618 | |
619 modcmds = dict.fromkeys([c.split('|', 1)[0] for c in mod.cmdtable]) | |
620 helplist(modcmds.has_key) | |
621 | |
622 if name and name != 'shortlist': | |
623 try: | |
624 helpcmd(name) | |
625 except UnknownCommand: | |
626 helpext(name) | |
627 | |
628 else: | |
629 # program name | |
630 if ui.verbose or with_version: | |
631 show_version(ui) | |
632 else: | |
633 ui.status(_("Mercurial Distributed SCM\n")) | |
634 ui.status('\n') | |
635 | |
636 # list of commands | |
637 if name == "shortlist": | |
638 ui.status(_('basic commands (use "hg help" ' | |
639 'for the full list or option "-v" for details):\n\n')) | |
640 elif ui.verbose: | |
641 ui.status(_('list of commands:\n\n')) | |
642 else: | |
643 ui.status(_('list of commands (use "hg help -v" ' | |
644 'to show aliases and global options):\n\n')) | |
645 | |
646 helplist() | |
607 | 647 |
608 # global options | 648 # global options |
609 if ui.verbose: | 649 if ui.verbose: |
610 option_lists.append(("global options", globalopts)) | 650 option_lists.append(("global options", globalopts)) |
611 | 651 |
1252 | 1292 |
1253 if opts['options']: | 1293 if opts['options']: |
1254 options = [] | 1294 options = [] |
1255 otables = [globalopts] | 1295 otables = [globalopts] |
1256 if cmd: | 1296 if cmd: |
1257 aliases, entry = find(cmd) | 1297 aliases, entry = findcmd(cmd) |
1258 otables.append(entry[1]) | 1298 otables.append(entry[1]) |
1259 for t in otables: | 1299 for t in otables: |
1260 for o in t: | 1300 for o in t: |
1261 if o[0]: | 1301 if o[0]: |
1262 options.append('-%s' % o[0]) | 1302 options.append('-%s' % o[0]) |
3272 if not choice and debugchoice: | 3312 if not choice and debugchoice: |
3273 choice = debugchoice | 3313 choice = debugchoice |
3274 | 3314 |
3275 return choice | 3315 return choice |
3276 | 3316 |
3277 def find(cmd): | 3317 def findcmd(cmd): |
3278 """Return (aliases, command table entry) for command string.""" | 3318 """Return (aliases, command table entry) for command string.""" |
3279 choice = findpossible(cmd) | 3319 choice = findpossible(cmd) |
3280 | 3320 |
3281 if choice.has_key(cmd): | 3321 if choice.has_key(cmd): |
3282 return choice[cmd] | 3322 return choice[cmd] |
3309 except fancyopts.getopt.GetoptError, inst: | 3349 except fancyopts.getopt.GetoptError, inst: |
3310 raise ParseError(None, inst) | 3350 raise ParseError(None, inst) |
3311 | 3351 |
3312 if args: | 3352 if args: |
3313 cmd, args = args[0], args[1:] | 3353 cmd, args = args[0], args[1:] |
3314 aliases, i = find(cmd) | 3354 aliases, i = findcmd(cmd) |
3315 cmd = aliases[0] | 3355 cmd = aliases[0] |
3316 defaults = ui.config("defaults", cmd) | 3356 defaults = ui.config("defaults", cmd) |
3317 if defaults: | 3357 if defaults: |
3318 args = defaults.split() + args | 3358 args = defaults.split() + args |
3319 c = list(i[1]) | 3359 c = list(i[1]) |
3336 options[n] = cmdoptions[n] | 3376 options[n] = cmdoptions[n] |
3337 del cmdoptions[n] | 3377 del cmdoptions[n] |
3338 | 3378 |
3339 return (cmd, cmd and i[0] or None, args, options, cmdoptions) | 3379 return (cmd, cmd and i[0] or None, args, options, cmdoptions) |
3340 | 3380 |
3381 external = {} | |
3382 | |
3383 def findext(name): | |
3384 '''return module with given extension name''' | |
3385 try: | |
3386 return external[name] | |
3387 except KeyError: | |
3388 dotname = '.' + name | |
3389 for k, v in external.iteritems(): | |
3390 if k.endswith('.' + name) or v.__name__ == name: | |
3391 return v | |
3392 raise KeyError(name) | |
3393 | |
3341 def dispatch(args): | 3394 def dispatch(args): |
3342 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': | 3395 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
3343 num = getattr(signal, name, None) | 3396 num = getattr(signal, name, None) |
3344 if num: signal.signal(num, catchterm) | 3397 if num: signal.signal(num, catchterm) |
3345 | 3398 |
3347 u = ui.ui(traceback='--traceback' in sys.argv[1:]) | 3400 u = ui.ui(traceback='--traceback' in sys.argv[1:]) |
3348 except util.Abort, inst: | 3401 except util.Abort, inst: |
3349 sys.stderr.write(_("abort: %s\n") % inst) | 3402 sys.stderr.write(_("abort: %s\n") % inst) |
3350 return -1 | 3403 return -1 |
3351 | 3404 |
3352 external = [] | |
3353 for x in u.extensions(): | 3405 for x in u.extensions(): |
3354 try: | 3406 try: |
3355 if x[1]: | 3407 if x[1]: |
3356 # the module will be loaded in sys.modules | 3408 # the module will be loaded in sys.modules |
3357 # choose an unique name so that it doesn't | 3409 # choose an unique name so that it doesn't |
3364 components = name.split('.') | 3416 components = name.split('.') |
3365 for comp in components[1:]: | 3417 for comp in components[1:]: |
3366 mod = getattr(mod, comp) | 3418 mod = getattr(mod, comp) |
3367 return mod | 3419 return mod |
3368 try: | 3420 try: |
3369 mod = importh("hgext." + x[0]) | 3421 name = 'hgext.' + x[0] |
3422 mod = importh(name) | |
3370 except ImportError: | 3423 except ImportError: |
3371 mod = importh(x[0]) | 3424 name = x[0] |
3372 external.append(mod) | 3425 mod = importh(name) |
3426 external[name] = mod | |
3373 except (util.SignalInterrupt, KeyboardInterrupt): | 3427 except (util.SignalInterrupt, KeyboardInterrupt): |
3374 raise | 3428 raise |
3375 except Exception, inst: | 3429 except Exception, inst: |
3376 u.warn(_("*** failed to import extension %s: %s\n") % (x[0], inst)) | 3430 u.warn(_("*** failed to import extension %s: %s\n") % (x[0], inst)) |
3377 if u.print_exc(): | 3431 if u.print_exc(): |
3378 return 1 | 3432 return 1 |
3379 | 3433 |
3380 for x in external: | 3434 for x in external.itervalues(): |
3381 uisetup = getattr(x, 'uisetup', None) | 3435 uisetup = getattr(x, 'uisetup', None) |
3382 if uisetup: | 3436 if uisetup: |
3383 uisetup(u) | 3437 uisetup(u) |
3384 cmdtable = getattr(x, 'cmdtable', {}) | 3438 cmdtable = getattr(x, 'cmdtable', {}) |
3385 for t in cmdtable: | 3439 for t in cmdtable: |
3431 if cmd not in norepo.split(): | 3485 if cmd not in norepo.split(): |
3432 try: | 3486 try: |
3433 if not repo: | 3487 if not repo: |
3434 repo = hg.repository(u, path=path) | 3488 repo = hg.repository(u, path=path) |
3435 u = repo.ui | 3489 u = repo.ui |
3436 for x in external: | 3490 for x in external.itervalues(): |
3437 if hasattr(x, 'reposetup'): | 3491 if hasattr(x, 'reposetup'): |
3438 x.reposetup(u, repo) | 3492 x.reposetup(u, repo) |
3439 except hg.RepoError: | 3493 except hg.RepoError: |
3440 if cmd not in optionalrepo.split(): | 3494 if cmd not in optionalrepo.split(): |
3441 raise | 3495 raise |