mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 22:01:30 +00:00
Bug 1108399 - Handle help on mach sub-commands; r=ahal
--HG-- extra : rebase_source : b0a0ce3f5f6bf31ee3e0cd7d7cfd3be0fa9db598 extra : histedit_source : 2aee6a7bba61ce8074df1ed5edcd7fc2d27c5bf8
This commit is contained in:
parent
df110b64e1
commit
16347a2b0d
@ -122,6 +122,21 @@ class CommandAction(argparse.Action):
|
||||
|
||||
handler = self._mach_registrar.command_handlers.get(command)
|
||||
|
||||
# If there are sub-commands, parse the intent out immediately.
|
||||
if handler.subcommand_handlers:
|
||||
if not args:
|
||||
self._handle_subcommand_main_help(parser, handler)
|
||||
sys.exit(0)
|
||||
elif len(args) == 1 and args[0] in ('help', '--help'):
|
||||
self._handle_subcommand_main_help(parser, handler)
|
||||
sys.exit(0)
|
||||
# mach <command> help <subcommand>
|
||||
elif len(args) == 2 and args[0] == 'help':
|
||||
subcommand = args[1]
|
||||
subhandler = handler.subcommand_handlers[subcommand]
|
||||
self._handle_subcommand_help(parser, command, subcommand, subhandler)
|
||||
sys.exit(0)
|
||||
|
||||
# We create a new parser, populate it with the command's arguments,
|
||||
# then feed all remaining arguments to it, merging the results
|
||||
# with ourselves. This is essentially what argparse subparsers
|
||||
@ -267,6 +282,10 @@ class CommandAction(argparse.Action):
|
||||
if not handler:
|
||||
raise UnknownCommandError(command, 'query')
|
||||
|
||||
if handler.subcommand_handlers:
|
||||
self._handle_subcommand_main_help(parser, handler)
|
||||
return
|
||||
|
||||
# This code is worth explaining. Because we are doing funky things with
|
||||
# argument registration to allow the same option in both global and
|
||||
# command arguments, we can't simply put all arguments on the same
|
||||
@ -316,6 +335,30 @@ class CommandAction(argparse.Action):
|
||||
print('')
|
||||
c_parser.print_help()
|
||||
|
||||
def _handle_subcommand_main_help(self, parser, handler):
|
||||
parser.usage = '%(prog)s [global arguments] ' + handler.name + \
|
||||
' subcommand [subcommand arguments]'
|
||||
group = parser.add_argument_group('Sub Commands')
|
||||
|
||||
for subcommand, subhandler in sorted(handler.subcommand_handlers.iteritems()):
|
||||
group.add_argument(subcommand, help=subhandler.description,
|
||||
action='store_true')
|
||||
|
||||
parser.print_help()
|
||||
|
||||
def _handle_subcommand_help(self, parser, command, subcommand, handler):
|
||||
parser.usage = '%(prog)s [global arguments] ' + command + \
|
||||
' ' + subcommand + ' [command arguments]'
|
||||
|
||||
c_parser = argparse.ArgumentParser(add_help=False,
|
||||
formatter_class=CommandFormatter)
|
||||
group = c_parser.add_argument_group('Sub Command Arguments')
|
||||
self._populate_command_group(c_parser, handler, group)
|
||||
|
||||
parser.print_help()
|
||||
print('')
|
||||
c_parser.print_help()
|
||||
|
||||
class NoUsageFormatter(argparse.HelpFormatter):
|
||||
def _format_usage(self, *args, **kwargs):
|
||||
return ""
|
||||
|
Loading…
Reference in New Issue
Block a user