diff options
| -rw-r--r-- | scripts/lib/argparse_oe.py | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py index c2fee6de05..ec7eb8d191 100644 --- a/scripts/lib/argparse_oe.py +++ b/scripts/lib/argparse_oe.py @@ -9,3 +9,42 @@ class ArgumentParser(argparse.ArgumentParser):          self.print_help()          sys.exit(2) +    def add_subparsers(self, *args, **kwargs): +        ret = super(ArgumentParser, self).add_subparsers(*args, **kwargs) +        ret._parser_class = ArgumentSubParser +        return ret + +class ArgumentSubParser(ArgumentParser): +    def parse_known_args(self, args=None, namespace=None): +        # This works around argparse not handling optional positional arguments being +        # intermixed with other options. A pretty horrible hack, but we're not left +        # with much choice given that the bug in argparse exists and it's difficult +        # to subclass. +        # Borrowed from http://stackoverflow.com/questions/20165843/argparse-how-to-handle-variable-number-of-arguments-nargs +        # with an extra workaround (in format_help() below) for the positional +        # arguments disappearing from the --help output, as well as structural tweaks. +        # Originally simplified from http://bugs.python.org/file30204/test_intermixed.py +        positionals = self._get_positional_actions() +        for action in positionals: +            # deactivate positionals +            action.save_nargs = action.nargs +            action.nargs = 0 + +        namespace, remaining_args = super(ArgumentSubParser, self).parse_known_args(args, namespace) +        for action in positionals: +            # remove the empty positional values from namespace +            if hasattr(namespace, action.dest): +                delattr(namespace, action.dest) +        for action in positionals: +            action.nargs = action.save_nargs +        # parse positionals +        namespace, extras = super(ArgumentSubParser, self).parse_known_args(remaining_args, namespace) +        return namespace, extras + +    def format_help(self): +        # Quick, restore the positionals! +        positionals = self._get_positional_actions() +        for action in positionals: +            if hasattr(action, 'save_nargs'): +                action.nargs = action.save_nargs +        return super(ArgumentParser, self).format_help() | 
