0
0
Fork 0
mirror of https://projects.torsion.org/witten/borgmatic.git synced 2025-04-11 15:51:23 +00:00

Fix use of dashed command-line flags like "--repositories[2].append-only" generated from configuration ().

This commit is contained in:
Dan Helfman 2025-04-01 23:04:53 -07:00
parent affe7cdc1b
commit 4065c5d0f7
3 changed files with 56 additions and 16 deletions
borgmatic/commands
tests
integration/commands
unit/commands

View file

@ -359,7 +359,9 @@ def add_array_element_arguments(arguments_group, unparsed_arguments, flag_name):
if '[0]' not in flag_name or not unparsed_arguments or '--help' in unparsed_arguments:
return
pattern = re.compile(fr'^--{flag_name.replace("[0]", r"\[\d+\]").replace(".", r"\.")}$')
pattern = re.compile(
fr'^--{flag_name.replace("[0]", r"\[\d+\]").replace(".", r"\.").replace("_", "-")}$'
)
try:
# Find an existing list index flag (and its action) corresponding to the given flag name.
@ -368,7 +370,7 @@ def add_array_element_arguments(arguments_group, unparsed_arguments, flag_name):
for action in arguments_group._group_actions
for action_flag_name in action.option_strings
if pattern.match(action_flag_name)
if f'--{flag_name}'.startswith(action_flag_name)
if f'--{flag_name.replace("_", "-")}'.startswith(action_flag_name)
)
# Based on the type of the action (e.g. argparse._StoreTrueAction), look up the corresponding
@ -388,16 +390,25 @@ def add_array_element_arguments(arguments_group, unparsed_arguments, flag_name):
if not pattern.match(unparsed_flag_name) or unparsed_flag_name == existing_flag_name:
continue
arguments_group.add_argument(
unparsed_flag_name,
action=action_registry_name,
choices=argument_action.choices,
default=argument_action.default,
dest=unparsed_flag_name.lstrip('-'),
nargs=argument_action.nargs,
required=argument_action.nargs,
type=argument_action.type,
)
if action_registry_name in ('store_true', 'store_false'):
arguments_group.add_argument(
unparsed_flag_name,
action=action_registry_name,
default=argument_action.default,
dest=unparsed_flag_name.lstrip('-'),
required=argument_action.nargs,
)
else:
arguments_group.add_argument(
unparsed_flag_name,
action=action_registry_name,
choices=argument_action.choices,
default=argument_action.default,
dest=unparsed_flag_name.lstrip('-'),
nargs=argument_action.nargs,
required=argument_action.nargs,
type=argument_action.type,
)
def add_arguments_from_schema(arguments_group, schema, unparsed_arguments, names=None):

View file

@ -51,12 +51,9 @@ def test_add_array_element_arguments_adds_arguments_for_array_index_flags():
flexmock(arguments_group).should_receive('add_argument').with_args(
'--foo[25].val',
action='store_true',
choices=object,
default=object,
default=False,
dest='foo[25].val',
nargs=object,
required=object,
type=object,
).once()
module.add_array_element_arguments(

View file

@ -880,6 +880,38 @@ def test_add_array_element_arguments_adds_arguments_for_array_index_flags_with_e
)
def test_add_array_element_arguments_adds_arguments_for_array_index_flags_with_dashes():
arguments_group = flexmock(
_group_actions=(
Group_action(
option_strings=('--foo[0].val-and-stuff',),
choices=flexmock(),
default=flexmock(),
nargs=flexmock(),
required=flexmock(),
type=flexmock(),
),
),
_registries={'action': {'store_stuff': Group_action}},
)
arguments_group.should_receive('add_argument').with_args(
'--foo[25].val-and-stuff',
action='store_stuff',
choices=object,
default=object,
dest='foo[25].val-and-stuff',
nargs=object,
required=object,
type=object,
).once()
module.add_array_element_arguments(
arguments_group=arguments_group,
unparsed_arguments=('--foo[25].val-and-stuff', 'fooval', '--bar[1].val', 'barval'),
flag_name='foo[0].val_and_stuff',
)
def test_add_arguments_from_schema_with_non_dict_schema_bails():
arguments_group = flexmock()
flexmock(module).should_receive('make_argument_description').never()