浏览代码

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

Dan Helfman 3 月之前
父节点
当前提交
4065c5d0f7
共有 3 个文件被更改,包括 56 次插入16 次删除
  1. 23 12
      borgmatic/commands/arguments.py
  2. 1 4
      tests/integration/commands/test_arguments.py
  3. 32 0
      tests/unit/commands/test_arguments.py

+ 23 - 12
borgmatic/commands/arguments.py

@@ -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):

+ 1 - 4
tests/integration/commands/test_arguments.py

@@ -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(

+ 32 - 0
tests/unit/commands/test_arguments.py

@@ -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()