mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Update mach to latest changes from mozilla-central
Updates the way mach mixes unrecognized arguments and predefined arguments (see [mozilla bug 1076649](https://bugzilla.mozilla.org/show_bug.cgi?id=1076649) for details on this change).
This commit is contained in:
parent
a1a268ce1d
commit
850da49846
3 changed files with 109 additions and 26 deletions
|
@ -135,19 +135,32 @@ class CommandAction(argparse.Action):
|
|||
parser_args = {
|
||||
'add_help': False,
|
||||
'usage': '%(prog)s [global arguments] ' + command +
|
||||
' command arguments]',
|
||||
' [command arguments]',
|
||||
}
|
||||
|
||||
if handler.allow_all_arguments:
|
||||
parser_args['prefix_chars'] = '+'
|
||||
|
||||
if handler.parser:
|
||||
subparser = handler.parser
|
||||
else:
|
||||
subparser = argparse.ArgumentParser(**parser_args)
|
||||
|
||||
remainder = None
|
||||
|
||||
for arg in handler.arguments:
|
||||
subparser.add_argument(*arg[0], **arg[1])
|
||||
# Remove our group keyword; it's not needed here.
|
||||
group_name = arg[1].get('group')
|
||||
if group_name:
|
||||
del arg[1]['group']
|
||||
|
||||
if arg[1].get('nargs') == argparse.REMAINDER:
|
||||
# parse_known_args expects all argparse.REMAINDER ('...')
|
||||
# arguments to be all stuck together. Instead, we want them to
|
||||
# pick any extra argument, wherever they are.
|
||||
# Assume a limited CommandArgument for those arguments.
|
||||
assert len(arg[0]) == 1
|
||||
assert all(k in ('default', 'nargs', 'help') for k in arg[1])
|
||||
remainder = arg
|
||||
else:
|
||||
subparser.add_argument(*arg[0], **arg[1])
|
||||
|
||||
# We define the command information on the main parser result so as to
|
||||
# not interfere with arguments passed to the command.
|
||||
|
@ -156,7 +169,32 @@ class CommandAction(argparse.Action):
|
|||
|
||||
command_namespace, extra = subparser.parse_known_args(args)
|
||||
setattr(namespace, 'command_args', command_namespace)
|
||||
if extra:
|
||||
if remainder:
|
||||
(name,), options = remainder
|
||||
# parse_known_args usefully puts all arguments after '--' in
|
||||
# extra, but also puts '--' there. We don't want to pass it down
|
||||
# to the command handler. Note that if multiple '--' are on the
|
||||
# command line, only the first one is removed, so that subsequent
|
||||
# ones are passed down.
|
||||
if '--' in extra:
|
||||
extra.remove('--')
|
||||
|
||||
# Commands with argparse.REMAINDER arguments used to force the
|
||||
# other arguments to be '+' prefixed. If a user now passes such
|
||||
# an argument, if will silently end up in extra. So, check if any
|
||||
# of the allowed arguments appear in a '+' prefixed form, and error
|
||||
# out if that's the case.
|
||||
for args, _ in handler.arguments:
|
||||
for arg in args:
|
||||
arg = arg.replace('-', '+', 1)
|
||||
if arg in extra:
|
||||
raise UnrecognizedArgumentError(command, [arg])
|
||||
|
||||
if extra:
|
||||
setattr(command_namespace, name, extra)
|
||||
else:
|
||||
setattr(command_namespace, name, options.get('default', []))
|
||||
elif extra:
|
||||
raise UnrecognizedArgumentError(command, extra)
|
||||
|
||||
def _handle_main_help(self, parser, verbose):
|
||||
|
@ -234,9 +272,6 @@ class CommandAction(argparse.Action):
|
|||
'add_help': False,
|
||||
}
|
||||
|
||||
if handler.allow_all_arguments:
|
||||
parser_args['prefix_chars'] = '+'
|
||||
|
||||
if handler.parser:
|
||||
c_parser = handler.parser
|
||||
c_parser.formatter_class = NoUsageFormatter
|
||||
|
@ -258,7 +293,18 @@ class CommandAction(argparse.Action):
|
|||
c_parser = argparse.ArgumentParser(**parser_args)
|
||||
group = c_parser.add_argument_group('Command Arguments')
|
||||
|
||||
extra_groups = {}
|
||||
for group_name in handler.argument_group_names:
|
||||
group_full_name = 'Command Arguments for ' + group_name
|
||||
extra_groups[group_name] = \
|
||||
c_parser.add_argument_group(group_full_name)
|
||||
|
||||
for arg in handler.arguments:
|
||||
# Apply our group keyword.
|
||||
group_name = arg[1].get('group')
|
||||
if group_name:
|
||||
del arg[1]['group']
|
||||
group = extra_groups[group_name]
|
||||
group.add_argument(*arg[0], **arg[1])
|
||||
|
||||
# This will print the description of the command below the usage.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue