diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2015-06-19 17:12:14 +0200 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2015-06-19 17:35:24 +0200 |
commit | 5e56ae8b13b42294cb7f2fff8065fc08e4740455 (patch) | |
tree | 00213a1501acad92e534c5f18b0d841d5e254de7 | |
parent | 96d2ec9ac4bc1e820bb26b3fbbf235f0277df5d6 (diff) | |
download | clufter-5e56ae8b13b42294cb7f2fff8065fc08e4740455.tar.gz clufter-5e56ae8b13b42294cb7f2fff8065fc08e4740455.tar.xz clufter-5e56ae8b13b42294cb7f2fff8065fc08e4740455.zip |
main+command_manager: allow symlink shortcuts to subcommands
# ln -s /bin/clufter /bin/ccs-disable-rg
# ccs-disable-rg -h | head -n1
> Usage: ccs-disable-rg [<cmd option ...>]
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
-rw-r--r-- | command_manager.py | 5 | ||||
-rw-r--r-- | main.py | 17 |
2 files changed, 14 insertions, 8 deletions
diff --git a/command_manager.py b/command_manager.py index 318ac4f..3dac1b4 100644 --- a/command_manager.py +++ b/command_manager.py @@ -113,8 +113,9 @@ class CommandManager(PluginManager): if opts.help: usage = ('\n' + len('Usage: ') * ' ').join(map( lambda c: - "%prog [<global option> ...] {0} [<cmd option ...>]" - .format(c), + "{0}{1} [<cmd option ...>]" + .format("%prog [<global option> ...] " + if parser.prog != c else '', c), sorted(set([cmd, canonical_cmd]), key=lambda i: int(i == canonical_cmd)) )) @@ -9,7 +9,7 @@ import logging from optparse import OptionParser, \ OptionGroup, \ IndentedHelpFormatter -from os.path import basename +from os.path import basename, realpath from platform import system, linux_distribution try: from platform import _supported_dists @@ -24,7 +24,7 @@ from .completion import Completion from .error import EC from .facts import aliases_dist from .utils import args2sgpl, head_tail, identity -from .utils_prog import ExpertOption, make_options, set_logging +from .utils_prog import ExpertOption, make_options, set_logging, which _system = system().lower() @@ -257,8 +257,10 @@ def run(argv=None, *args): # re option parser: only one instance is used, modified along ec = EC.EXIT_SUCCESS argv = list(argv) + list(args) if argv else list(args) - prog, args = (argv[0], argv[1:]) if argv else ('<script>', []) + prog, argv = (argv[0], argv[1:]) if argv else ('<script>', []) prog_simple = basename(prog) + prog_full = prog if prog != prog_simple else which(prog_simple, '.', '') + prog_real = basename(realpath(prog_full)) parser = SharedOptionParser(prog=prog_simple, add_help_option=False) parser.disable_interspersed_args() # enforce ordering as per "usage" @@ -272,8 +274,8 @@ def run(argv=None, *args): option_list=make_options(opts_common) ) - opts, args = parser.parse_args(args) - if opts.help is None: + opts, args = parser.parse_args(argv) + if prog_simple == prog_real and opts.help is None: # options that return/exit + don't need plugin resolutions (not help) if opts.version: loglevel = logging.getLevelName(opts.loglevel) @@ -296,7 +298,8 @@ def run(argv=None, *args): cm = CommandManager.init_lookup(ext_plugins=not opts.skip_ext, ext_plugins_user=opts.ext_user, system=opts.sys, system_extra=opts.dist) - if not opts.help and (opts.list or opts.completion or not args): + if prog_simple == prog_real and not opts.help \ + and (opts.list or opts.completion or not args): cmds = cm.pretty_cmds(ind=' ' * parser.formatter.indent_increment, linesep_width=2, cmds_intro="Commands" @@ -322,6 +325,8 @@ def run(argv=None, *args): " just precede or follow it with `--help'.") ) return ec + elif prog_simple != prog_real: + args = [prog_simple] + argv # prepare option parser to be reused by sub-commands parser.enable_interspersed_args() |