summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2015-06-19 17:12:14 +0200
committerJan Pokorný <jpokorny@redhat.com>2015-06-19 17:35:24 +0200
commit5e56ae8b13b42294cb7f2fff8065fc08e4740455 (patch)
tree00213a1501acad92e534c5f18b0d841d5e254de7
parent96d2ec9ac4bc1e820bb26b3fbbf235f0277df5d6 (diff)
downloadclufter-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.py5
-rw-r--r--main.py17
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))
))
diff --git a/main.py b/main.py
index b9d3c70..6d33a13 100644
--- a/main.py
+++ b/main.py
@@ -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()