[oe-commits] [openembedded-core] 22/31: scripts/lib/argparse_oe: show subparser help for unrecognized args

git at git.openembedded.org git at git.openembedded.org
Fri Apr 29 08:24:29 UTC 2016


rpurdie pushed a commit to branch master-next
in repository openembedded-core.

commit a57746ce5ce93d45e35a4395cb38443197a32c37
Author: Christopher Larson <chris_larson at mentor.com>
AuthorDate: Wed Apr 27 16:23:59 2016 -0700

    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 at mentor.com>
    Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 scripts/lib/argparse_oe.py | 49 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index 95b42e7..75002d0 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):

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list