diff options
author | Christopher Larson <chris_larson@mentor.com> | 2016-04-27 16:23:59 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-05-06 10:30:56 +0100 |
commit | 7fdaaedf4c63c8d019f03f84e22f9b838ef19aa6 (patch) | |
tree | 81f11f77234713010824fec3d1cc205c16c58da1 /scripts/lib | |
parent | cf0c5175136966eefde8c0d9aa0679e85779f713 (diff) | |
download | openembedded-core-7fdaaedf4c63c8d019f03f84e22f9b838ef19aa6.tar.gz openembedded-core-7fdaaedf4c63c8d019f03f84e22f9b838ef19aa6.tar.bz2 openembedded-core-7fdaaedf4c63c8d019f03f84e22f9b838ef19aa6.zip |
scripts/lib/argparse_oe: show subparser help for unrecognized args
As an example, `recipetool create foo bar baz` shows `recipetool: error:
unrecognized arguments: bar baz` and then displays the main help, not the help
for the create command. Fix by saving the subparser name and using it in
parse_args() to look up the subparser.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib')
-rw-r--r-- | scripts/lib/argparse_oe.py | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py index 95b42e75ea..75002d02af 100644 --- a/scripts/lib/argparse_oe.py +++ b/scripts/lib/argparse_oe.py @@ -27,15 +27,20 @@ class ArgumentParser(argparse.ArgumentParser): 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 @@ -48,6 +53,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): |