mirror of https://github.com/python/cpython.git
[3.11] gh-96310: Fix a traceback in argparse when all options in a mutually exclusive group are suppressed (GH-96311) (GH-115768)
Reproducer depends on terminal size - the traceback occurs when there's
an option long enough so the usage line doesn't fit the terminal width.
Option order is also important for reproducibility.
Excluding empty groups (with all options suppressed) from inserts
fixes the problem.
(cherry picked from commit 5f7df88821
)
Co-authored-by: Daniel Mach <daniel.mach@suse.com>
This commit is contained in:
parent
35e5bbc845
commit
a27c540d20
|
@ -414,6 +414,8 @@ def _format_actions_usage(self, actions, groups):
|
|||
suppressed_actions_count += 1
|
||||
|
||||
exposed_actions_count = group_action_count - suppressed_actions_count
|
||||
if not exposed_actions_count:
|
||||
continue
|
||||
|
||||
if not group.required:
|
||||
if start in inserts:
|
||||
|
|
|
@ -2743,6 +2743,27 @@ def test_help(self):
|
|||
'''
|
||||
self.assertEqual(parser.format_help(), textwrap.dedent(expected))
|
||||
|
||||
def test_help_subparser_all_mutually_exclusive_group_members_suppressed(self):
|
||||
self.maxDiff = None
|
||||
parser = ErrorRaisingArgumentParser(prog='PROG')
|
||||
commands = parser.add_subparsers(title="commands", dest="command")
|
||||
cmd_foo = commands.add_parser("foo")
|
||||
group = cmd_foo.add_mutually_exclusive_group()
|
||||
group.add_argument('--verbose', action='store_true', help=argparse.SUPPRESS)
|
||||
group.add_argument('--quiet', action='store_true', help=argparse.SUPPRESS)
|
||||
longopt = '--' + 'long'*32
|
||||
longmeta = 'LONG'*32
|
||||
cmd_foo.add_argument(longopt)
|
||||
expected = f'''\
|
||||
usage: PROG foo [-h]
|
||||
[{longopt} {longmeta}]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
{longopt} {longmeta}
|
||||
'''
|
||||
self.assertEqual(cmd_foo.format_help(), textwrap.dedent(expected))
|
||||
|
||||
def test_empty_group(self):
|
||||
# See issue 26952
|
||||
parser = argparse.ArgumentParser()
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix a traceback in :mod:`argparse` when all options in a mutually exclusive
|
||||
group are suppressed.
|
Loading…
Reference in New Issue