diff options
Diffstat (limited to 'import-layers/yocto-poky/scripts/lib/argparse_oe.py')
-rw-r--r-- | import-layers/yocto-poky/scripts/lib/argparse_oe.py | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/import-layers/yocto-poky/scripts/lib/argparse_oe.py b/import-layers/yocto-poky/scripts/lib/argparse_oe.py index bf3ebaddf..bf6eb1719 100644 --- a/import-layers/yocto-poky/scripts/lib/argparse_oe.py +++ b/import-layers/yocto-poky/scripts/lib/argparse_oe.py @@ -14,23 +14,35 @@ class ArgumentParser(argparse.ArgumentParser): kwargs.setdefault('formatter_class', OeHelpFormatter) self._subparser_groups = OrderedDict() super(ArgumentParser, self).__init__(*args, **kwargs) + self._positionals.title = 'arguments' + self._optionals.title = 'options' def error(self, message): - sys.stderr.write('ERROR: %s\n' % message) - self.print_help() + """error(message: string) + + Prints a help message incorporating the message to stderr and + exits. + """ + self._print_message('%s: error: %s\n' % (self.prog, message), sys.stderr) + self.print_help(sys.stderr) sys.exit(2) def error_subcommand(self, message, subcommand): if subcommand: - for action in self._actions: - if isinstance(action, argparse._SubParsersAction): - for choice, subparser in action.choices.items(): - if choice == subcommand: - subparser.error(message) - return + action = self._get_subparser_action() + try: + subparser = action._name_parser_map[subcommand] + except KeyError: + self.error('no subparser for name "%s"' % subcommand) + else: + subparser.error(message) + self.error(message) def add_subparsers(self, *args, **kwargs): + if 'dest' not in kwargs: + kwargs['dest'] = '_subparser_name' + ret = super(ArgumentParser, self).add_subparsers(*args, **kwargs) # Need a way of accessing the parent parser ret._parent_parser = self @@ -43,6 +55,38 @@ class ArgumentParser(argparse.ArgumentParser): def add_subparser_group(self, groupname, groupdesc, order=0): self._subparser_groups[groupname] = (groupdesc, order) + def parse_args(self, args=None, namespace=None): + """Parse arguments, using the correct subparser to show the error.""" + args, argv = self.parse_known_args(args, namespace) + if argv: + message = 'unrecognized arguments: %s' % ' '.join(argv) + if self._subparsers: + subparser = self._get_subparser(args) + subparser.error(message) + else: + self.error(message) + sys.exit(2) + return args + + def _get_subparser(self, args): + action = self._get_subparser_action() + if action.dest == argparse.SUPPRESS: + self.error('cannot get subparser, the subparser action dest is suppressed') + + name = getattr(args, action.dest) + try: + return action._name_parser_map[name] + except KeyError: + self.error('no subparser for name "%s"' % name) + + def _get_subparser_action(self): + if not self._subparsers: + self.error('cannot return the subparser action, no subparsers added') + + for action in self._subparsers._group_actions: + if isinstance(action, argparse._SubParsersAction): + return action + class ArgumentSubParser(ArgumentParser): def __init__(self, *args, **kwargs): @@ -51,10 +95,6 @@ class ArgumentSubParser(ArgumentParser): if 'order' in kwargs: self._order = kwargs.pop('order') super(ArgumentSubParser, self).__init__(*args, **kwargs) - for agroup in self._action_groups: - if agroup.title == 'optional arguments': - agroup.title = 'options' - break def parse_known_args(self, args=None, namespace=None): # This works around argparse not handling optional positional arguments being |