Forráskód Böngészése

Add support for Borg 2's "--match-archives" flag (replaces "--glob-archives") (#591).

Dan Helfman 2 éve
szülő
commit
2774c2e4c0

+ 2 - 0
NEWS

@@ -3,6 +3,8 @@
    files for a "create" action to prevent Borg from hanging.
  * #587: Warn when ignoring a configured "read_special" value of false, as true is needed when
    database hooks are enabled.
+ * #591: Add support for Borg 2's "--match-archives" flag (replaces "--glob-archives").
+ * Fix for "borgmatic --archive latest" not finding the latest archive when a verbosity is set.
 
 1.7.2
  * #577: Fix regression in which "borgmatic info --archive ..." showed repository info instead of

+ 12 - 8
borgmatic/borg/check.py

@@ -5,7 +5,7 @@ import logging
 import os
 import pathlib
 
-from borgmatic.borg import environment, extract, flags, rinfo, state
+from borgmatic.borg import environment, extract, feature, flags, rinfo, state
 from borgmatic.execute import DO_NOT_CAPTURE, execute_command
 
 DEFAULT_CHECKS = (
@@ -146,9 +146,10 @@ def filter_checks_on_frequency(
     return tuple(filtered_checks)
 
 
-def make_check_flags(checks, check_last=None, prefix=None):
+def make_check_flags(local_borg_version, checks, check_last=None, prefix=None):
     '''
-    Given a parsed sequence of checks, transform it into tuple of command-line flags.
+    Given the local Borg version and a parsed sequence of checks, transform the checks into tuple of
+    command-line flags.
 
     For example, given parsed checks of:
 
@@ -163,14 +164,17 @@ def make_check_flags(checks, check_last=None, prefix=None):
 
     Additionally, if a check_last value is given and "archives" is in checks, then include a
     "--last" flag. And if a prefix value is given and "archives" is in checks, then include a
-    "--glob-archives" flag.
+    "--match-archives" flag.
     '''
     if 'archives' in checks:
         last_flags = ('--last', str(check_last)) if check_last else ()
-        glob_archives_flags = ('--glob-archives', f'{prefix}*') if prefix else ()
+        if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version):
+            match_archives_flags = ('--match-archives', f'sh:{prefix}*') if prefix else ()
+        else:
+            match_archives_flags = ('--glob-archives', f'{prefix}*') if prefix else ()
     else:
         last_flags = ()
-        glob_archives_flags = ()
+        match_archives_flags = ()
         if check_last:
             logger.info('Ignoring check_last option, as "archives" is not in consistency checks')
         if prefix:
@@ -184,7 +188,7 @@ def make_check_flags(checks, check_last=None, prefix=None):
     else:
         data_flags = ()
 
-    common_flags = last_flags + glob_archives_flags + data_flags
+    common_flags = last_flags + match_archives_flags + data_flags
 
     if {'repository', 'archives'}.issubset(set(checks)):
         return common_flags
@@ -298,7 +302,7 @@ def check_archives(
         full_command = (
             (local_path, 'check')
             + (('--repair',) if repair else ())
-            + make_check_flags(checks, check_last, prefix)
+            + make_check_flags(local_borg_version, checks, check_last, prefix)
             + (('--remote-path', remote_path) if remote_path else ())
             + (('--lock-wait', str(lock_wait)) if lock_wait else ())
             + verbosity_flags

+ 2 - 0
borgmatic/borg/feature.py

@@ -13,6 +13,7 @@ class Feature(Enum):
     RCREATE = 7
     RLIST = 8
     RINFO = 9
+    MATCH_ARCHIVES = 10
 
 
 FEATURE_TO_MINIMUM_BORG_VERSION = {
@@ -25,6 +26,7 @@ FEATURE_TO_MINIMUM_BORG_VERSION = {
     Feature.RCREATE: parse_version('2.0.0a2'),  # borg rcreate
     Feature.RLIST: parse_version('2.0.0a2'),  # borg rlist
     Feature.RINFO: parse_version('2.0.0a2'),  # borg rinfo
+    Feature.MATCH_ARCHIVES: parse_version('2.0.0b3'),  # borg --match-archives
 }
 
 

+ 11 - 3
borgmatic/borg/info.py

@@ -1,6 +1,6 @@
 import logging
 
-from borgmatic.borg import environment, flags
+from borgmatic.borg import environment, feature, flags
 from borgmatic.execute import execute_command
 
 logger = logging.getLogger(__name__)
@@ -36,7 +36,11 @@ def display_archives_info(
         + flags.make_flags('remote-path', remote_path)
         + flags.make_flags('lock-wait', lock_wait)
         + (
-            flags.make_flags('glob-archives', f'{info_arguments.prefix}*')
+            (
+                flags.make_flags('match-archives', f'sh:{info_arguments.prefix}*')
+                if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version)
+                else flags.make_flags('glob-archives', f'{info_arguments.prefix}*')
+            )
             if info_arguments.prefix
             else ()
         )
@@ -44,7 +48,11 @@ def display_archives_info(
             info_arguments, excludes=('repository', 'archive', 'prefix')
         )
         + flags.make_repository_flags(repository, local_borg_version)
-        + flags.make_flags('glob-archives', info_arguments.archive)
+        + (
+            flags.make_flags('match-archives', info_arguments.archive)
+            if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version)
+            else flags.make_flags('glob-archives', info_arguments.archive)
+        )
     )
 
     return execute_command(

+ 3 - 3
borgmatic/borg/list.py

@@ -9,7 +9,7 @@ from borgmatic.execute import execute_command
 logger = logging.getLogger(__name__)
 
 
-ARCHIVE_FILTER_FLAGS_MOVED_TO_RLIST = ('prefix', 'glob_archives', 'sort_by', 'first', 'last')
+ARCHIVE_FILTER_FLAGS_MOVED_TO_RLIST = ('prefix', 'match_archives', 'sort_by', 'first', 'last')
 MAKE_FLAGS_EXCLUDES = (
     'repository',
     'archive',
@@ -111,7 +111,7 @@ def list_archive(
             format=list_arguments.format,
             json=list_arguments.json,
             prefix=list_arguments.prefix,
-            glob_archives=list_arguments.glob_archives,
+            match_archives=list_arguments.match_archives,
             sort_by=list_arguments.sort_by,
             first=list_arguments.first,
             last=list_arguments.last,
@@ -143,7 +143,7 @@ def list_archive(
             format=None,
             json=None,
             prefix=list_arguments.prefix,
-            glob_archives=list_arguments.glob_archives,
+            match_archives=list_arguments.match_archives,
             sort_by=list_arguments.sort_by,
             first=list_arguments.first,
             last=list_arguments.last,

+ 5 - 1
borgmatic/borg/mount.py

@@ -39,7 +39,11 @@ def mount_archive(
         + (
             (
                 flags.make_repository_flags(repository, local_borg_version)
-                + ('--glob-archives', archive)
+                + (
+                    ('--match-archives', archive)
+                    if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version)
+                    else ('--glob-archives', archive)
+                )
             )
             if feature.available(feature.Feature.SEPARATE_REPOSITORY_ARCHIVE, local_borg_version)
             else (

+ 12 - 4
borgmatic/borg/prune.py

@@ -1,12 +1,12 @@
 import logging
 
-from borgmatic.borg import environment, flags
+from borgmatic.borg import environment, feature, flags
 from borgmatic.execute import execute_command
 
 logger = logging.getLogger(__name__)
 
 
-def make_prune_flags(retention_config):
+def make_prune_flags(retention_config, local_borg_version):
     '''
     Given a retention config dict mapping from option name to value, tranform it into an iterable of
     command-line name-value flag pairs.
@@ -24,8 +24,12 @@ def make_prune_flags(retention_config):
     '''
     config = retention_config.copy()
     prefix = config.pop('prefix', '{hostname}-')
+
     if prefix:
-        config['glob_archives'] = f'{prefix}*'
+        if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version):
+            config['match_archives'] = f'sh:{prefix}*'
+        else:
+            config['glob_archives'] = f'{prefix}*'
 
     return (
         ('--' + option_name.replace('_', '-'), str(value)) for option_name, value in config.items()
@@ -54,7 +58,11 @@ def prune_archives(
 
     full_command = (
         (local_path, 'prune')
-        + tuple(element for pair in make_prune_flags(retention_config) for element in pair)
+        + tuple(
+            element
+            for pair in make_prune_flags(retention_config, local_borg_version)
+            for element in pair
+        )
         + (('--remote-path', remote_path) if remote_path else ())
         + (('--umask', str(umask)) if umask else ())
         + (('--lock-wait', str(lock_wait)) if lock_wait else ())

+ 5 - 3
borgmatic/borg/rlist.py

@@ -26,8 +26,6 @@ def resolve_archive_name(
             local_path,
             'rlist' if feature.available(feature.Feature.RLIST, local_borg_version) else 'list',
         )
-        + (('--info',) if logger.getEffectiveLevel() == logging.INFO else ())
-        + (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
         + flags.make_flags('remote-path', remote_path)
         + flags.make_flags('lock-wait', lock_wait)
         + flags.make_flags('last', 1)
@@ -87,7 +85,11 @@ def make_rlist_command(
         + flags.make_flags('remote-path', remote_path)
         + flags.make_flags('lock-wait', lock_wait)
         + (
-            flags.make_flags('glob-archives', f'{rlist_arguments.prefix}*')
+            (
+                flags.make_flags('match-archives', f'sh:{rlist_arguments.prefix}*')
+                if feature.available(feature.Feature.MATCH_ARCHIVES, local_borg_version)
+                else flags.make_flags('glob-archives', f'{rlist_arguments.prefix}*')
+            )
             if rlist_arguments.prefix
             else ()
         )

+ 5 - 3
borgmatic/borg/transfer.py

@@ -25,12 +25,14 @@ def transfer_archives(
         + (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
         + flags.make_flags('remote-path', remote_path)
         + flags.make_flags('lock-wait', storage_config.get('lock_wait', None))
-        + flags.make_flags(
-            'glob-archives', transfer_arguments.glob_archives or transfer_arguments.archive
+        + (
+            flags.make_flags(
+                'match-archives', transfer_arguments.match_archives or transfer_arguments.archive
+            )
         )
         + flags.make_flags_from_arguments(
             transfer_arguments,
-            excludes=('repository', 'source_repository', 'archive', 'glob_archives'),
+            excludes=('repository', 'source_repository', 'archive', 'match_archives'),
         )
         + flags.make_repository_flags(repository, local_borg_version)
         + flags.make_flags('other-repo', transfer_arguments.source_repository)

+ 20 - 10
borgmatic/commands/arguments.py

@@ -293,9 +293,10 @@ def make_parsers():
     )
     transfer_group.add_argument(
         '-a',
+        '--match-archives',
         '--glob-archives',
-        metavar='GLOB',
-        help='Only transfer archives with names matching this glob',
+        metavar='PATTERN',
+        help='Only transfer archives with names matching this pattern',
     )
     transfer_group.add_argument(
         '--sort-by', metavar='KEYS', help='Comma-separated list of sorting keys'
@@ -627,7 +628,11 @@ def make_parsers():
         '-P', '--prefix', help='Only list archive names starting with this prefix'
     )
     rlist_group.add_argument(
-        '-a', '--glob-archives', metavar='GLOB', help='Only list archive names matching this glob'
+        '-a',
+        '--match-archives',
+        '--glob-archives',
+        metavar='PATTERN',
+        help='Only list archive names matching this pattern',
     )
     rlist_group.add_argument(
         '--sort-by', metavar='KEYS', help='Comma-separated list of sorting keys'
@@ -678,7 +683,11 @@ def make_parsers():
         '-P', '--prefix', help='Only list archive names starting with this prefix'
     )
     list_group.add_argument(
-        '-a', '--glob-archives', metavar='GLOB', help='Only list archive names matching this glob'
+        '-a',
+        '--match-archives',
+        '--glob-archives',
+        metavar='PATTERN',
+        help='Only list archive names matching this pattern',
     )
     list_group.add_argument(
         '--successful',
@@ -747,9 +756,10 @@ def make_parsers():
     )
     info_group.add_argument(
         '-a',
+        '--match-archives',
         '--glob-archives',
-        metavar='GLOB',
-        help='Only show info for archive names matching this glob',
+        metavar='PATTERN',
+        help='Only show info for archive names matching this pattern',
     )
     info_group.add_argument(
         '--sort-by', metavar='KEYS', help='Comma-separated list of sorting keys'
@@ -816,7 +826,7 @@ def parse_arguments(*unparsed_arguments):
     if (
         'transfer' in arguments
         and arguments['transfer'].archive
-        and arguments['transfer'].glob_archives
+        and arguments['transfer'].match_archives
     ):
         raise ValueError(
             'With the transfer action, only one of --archive and --glob-archives flags can be used.'
@@ -824,11 +834,11 @@ def parse_arguments(*unparsed_arguments):
 
     if 'info' in arguments and (
         (arguments['info'].archive and arguments['info'].prefix)
-        or (arguments['info'].archive and arguments['info'].glob_archives)
-        or (arguments['info'].prefix and arguments['info'].glob_archives)
+        or (arguments['info'].archive and arguments['info'].match_archives)
+        or (arguments['info'].prefix and arguments['info'].match_archives)
     ):
         raise ValueError(
-            'With the info action, only one of --archive, --prefix, or --glob-archives flags can be used.'
+            'With the info action, only one of --archive, --prefix, or --match-archives flags can be used.'
         )
 
     return arguments

+ 1 - 1
docs/how-to/inspect-your-backups.md

@@ -84,7 +84,7 @@ be a [Borg
 pattern](https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg-patterns).
 
 To limit the archives searched, use the standard `list` parameters for
-filtering archives such as `--last`, `--archive`, `--glob-archives`, etc. For
+filtering archives such as `--last`, `--archive`, `--match-archives`, etc. For
 example, to search only the last five archives:
 
 ```bash

+ 1 - 0
scripts/find-unsupported-borg-options

@@ -53,6 +53,7 @@ for sub_command in prune create check list info; do
             | grep -v '^--first' \
             | grep -v '^--format' \
             | grep -v '^--glob-archives' \
+            | grep -v '^--match-archives' \
             | grep -v '^--last' \
             | grep -v '^--format' \
             | grep -v '^--patterns-from' \

+ 7 - 7
tests/integration/commands/test_arguments.py

@@ -450,7 +450,7 @@ def test_parse_arguments_disallows_json_with_both_rinfo_and_info():
         module.parse_arguments('rinfo', 'info', '--json')
 
 
-def test_parse_arguments_disallows_transfer_with_both_archive_and_glob_archives():
+def test_parse_arguments_disallows_transfer_with_both_archive_and_match_archives():
     flexmock(module.collect).should_receive('get_default_config_paths').and_return(['default'])
 
     with pytest.raises(ValueError):
@@ -460,16 +460,16 @@ def test_parse_arguments_disallows_transfer_with_both_archive_and_glob_archives(
             'source.borg',
             '--archive',
             'foo',
-            '--glob-archives',
-            '*bar',
+            '--match-archives',
+            'sh:*bar',
         )
 
 
-def test_parse_arguments_disallows_info_with_both_archive_and_glob_archives():
+def test_parse_arguments_disallows_info_with_both_archive_and_match_archives():
     flexmock(module.collect).should_receive('get_default_config_paths').and_return(['default'])
 
     with pytest.raises(ValueError):
-        module.parse_arguments('info', '--archive', 'foo', '--glob-archives', '*bar')
+        module.parse_arguments('info', '--archive', 'foo', '--match-archives', 'sh:*bar')
 
 
 def test_parse_arguments_disallows_info_with_both_archive_and_prefix():
@@ -479,11 +479,11 @@ def test_parse_arguments_disallows_info_with_both_archive_and_prefix():
         module.parse_arguments('info', '--archive', 'foo', '--prefix', 'bar')
 
 
-def test_parse_arguments_disallows_info_with_both_prefix_and_glob_archives():
+def test_parse_arguments_disallows_info_with_both_prefix_and_match_archives():
     flexmock(module.collect).should_receive('get_default_config_paths').and_return(['default'])
 
     with pytest.raises(ValueError):
-        module.parse_arguments('info', '--prefix', 'foo', '--glob-archives', '*bar')
+        module.parse_arguments('info', '--prefix', 'foo', '--match-archives', 'sh:*bar')
 
 
 def test_parse_arguments_check_only_extract_does_not_raise_extract_subparser_error():

+ 70 - 28
tests/unit/borg/test_check.py

@@ -188,95 +188,137 @@ def test_filter_checks_on_frequency_restains_check_with_unelapsed_frequency_and_
 
 
 def test_make_check_flags_with_repository_check_returns_flag():
-    flags = module.make_check_flags(('repository',))
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository',))
 
     assert flags == ('--repository-only',)
 
 
 def test_make_check_flags_with_archives_check_returns_flag():
-    flags = module.make_check_flags(('archives',))
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('archives',))
 
     assert flags == ('--archives-only',)
 
 
 def test_make_check_flags_with_data_check_returns_flag_and_implies_archives():
-    flags = module.make_check_flags(('data',))
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('data',))
 
     assert flags == ('--archives-only', '--verify-data',)
 
 
 def test_make_check_flags_with_extract_omits_extract_flag():
-    flags = module.make_check_flags(('extract',))
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('extract',))
 
     assert flags == ()
 
 
 def test_make_check_flags_with_repository_and_data_checks_does_not_return_repository_only():
-    flags = module.make_check_flags(('repository', 'data',))
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository', 'data',))
 
     assert flags == ('--verify-data',)
 
 
 def test_make_check_flags_with_default_checks_and_default_prefix_returns_default_flags():
-    flags = module.make_check_flags(('repository', 'archives'), prefix=module.DEFAULT_PREFIX)
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-    assert flags == ('--glob-archives', f'{module.DEFAULT_PREFIX}*')
+    flags = module.make_check_flags(
+        '1.2.3', ('repository', 'archives'), prefix=module.DEFAULT_PREFIX
+    )
+
+    assert flags == ('--match-archives', f'sh:{module.DEFAULT_PREFIX}*')
 
 
 def test_make_check_flags_with_all_checks_and_default_prefix_returns_default_flags():
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags(
+        '1.2.3', ('repository', 'archives', 'extract'), prefix=module.DEFAULT_PREFIX
+    )
+
+    assert flags == ('--match-archives', f'sh:{module.DEFAULT_PREFIX}*')
+
+
+def test_make_check_flags_with_all_checks_and_default_prefix_without_borg_features_returns_glob_archives_flags():
+    flexmock(module.feature).should_receive('available').and_return(False)
+
     flags = module.make_check_flags(
-        ('repository', 'archives', 'extract'), prefix=module.DEFAULT_PREFIX
+        '1.2.3', ('repository', 'archives', 'extract'), prefix=module.DEFAULT_PREFIX
     )
 
     assert flags == ('--glob-archives', f'{module.DEFAULT_PREFIX}*')
 
 
 def test_make_check_flags_with_archives_check_and_last_includes_last_flag():
-    flags = module.make_check_flags(('archives',), check_last=3)
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('archives',), check_last=3)
 
     assert flags == ('--archives-only', '--last', '3')
 
 
 def test_make_check_flags_with_repository_check_and_last_omits_last_flag():
-    flags = module.make_check_flags(('repository',), check_last=3)
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository',), check_last=3)
 
     assert flags == ('--repository-only',)
 
 
 def test_make_check_flags_with_default_checks_and_last_includes_last_flag():
-    flags = module.make_check_flags(('repository', 'archives'), check_last=3)
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository', 'archives'), check_last=3)
 
     assert flags == ('--last', '3')
 
 
-def test_make_check_flags_with_archives_check_and_prefix_includes_glob_archives_flag():
-    flags = module.make_check_flags(('archives',), prefix='foo-')
+def test_make_check_flags_with_archives_check_and_prefix_includes_match_archives_flag():
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('archives',), prefix='foo-')
+
+    assert flags == ('--archives-only', '--match-archives', 'sh:foo-*')
 
-    assert flags == ('--archives-only', '--glob-archives', 'foo-*')
 
+def test_make_check_flags_with_archives_check_and_empty_prefix_omits_match_archives_flag():
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-def test_make_check_flags_with_archives_check_and_empty_prefix_omits_glob_archives_flag():
-    flags = module.make_check_flags(('archives',), prefix='')
+    flags = module.make_check_flags('1.2.3', ('archives',), prefix='')
 
     assert flags == ('--archives-only',)
 
 
-def test_make_check_flags_with_archives_check_and_none_prefix_omits_glob_archives_flag():
-    flags = module.make_check_flags(('archives',), prefix=None)
+def test_make_check_flags_with_archives_check_and_none_prefix_omits_match_archives_flag():
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('archives',), prefix=None)
 
     assert flags == ('--archives-only',)
 
 
-def test_make_check_flags_with_repository_check_and_prefix_omits_glob_archives_flag():
-    flags = module.make_check_flags(('repository',), prefix='foo-')
+def test_make_check_flags_with_repository_check_and_prefix_omits_match_archives_flag():
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository',), prefix='foo-')
 
     assert flags == ('--repository-only',)
 
 
-def test_make_check_flags_with_default_checks_and_prefix_includes_glob_archives_flag():
-    flags = module.make_check_flags(('repository', 'archives'), prefix='foo-')
+def test_make_check_flags_with_default_checks_and_prefix_includes_match_archives_flag():
+    flexmock(module.feature).should_receive('available').and_return(True)
+
+    flags = module.make_check_flags('1.2.3', ('repository', 'archives'), prefix='foo-')
 
-    assert flags == ('--glob-archives', 'foo-*')
+    assert flags == ('--match-archives', 'sh:foo-*')
 
 
 def test_read_check_time_does_not_raise():
@@ -369,7 +411,7 @@ def test_check_archives_calls_borg_with_parameters(checks):
         '{"repository": {"id": "repo"}}'
     )
     flexmock(module).should_receive('make_check_flags').with_args(
-        checks, check_last, module.DEFAULT_PREFIX
+        '1.2.3', checks, check_last, module.DEFAULT_PREFIX
     ).and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg', 'check', 'repo'))
@@ -523,7 +565,7 @@ def test_check_archives_with_local_path_calls_borg_via_local_path():
         '{"repository": {"id": "repo"}}'
     )
     flexmock(module).should_receive('make_check_flags').with_args(
-        checks, check_last, module.DEFAULT_PREFIX
+        '1.2.3', checks, check_last, module.DEFAULT_PREFIX
     ).and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg1', 'check', 'repo'))
@@ -550,7 +592,7 @@ def test_check_archives_with_remote_path_calls_borg_with_remote_path_parameters(
         '{"repository": {"id": "repo"}}'
     )
     flexmock(module).should_receive('make_check_flags').with_args(
-        checks, check_last, module.DEFAULT_PREFIX
+        '1.2.3', checks, check_last, module.DEFAULT_PREFIX
     ).and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg', 'check', '--remote-path', 'borg1', 'repo'))
@@ -577,7 +619,7 @@ def test_check_archives_with_lock_wait_calls_borg_with_lock_wait_parameters():
         '{"repository": {"id": "repo"}}'
     )
     flexmock(module).should_receive('make_check_flags').with_args(
-        checks, check_last, module.DEFAULT_PREFIX
+        '1.2.3', checks, check_last, module.DEFAULT_PREFIX
     ).and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg', 'check', '--lock-wait', '5', 'repo'))
@@ -604,7 +646,7 @@ def test_check_archives_with_retention_prefix():
         '{"repository": {"id": "repo"}}'
     )
     flexmock(module).should_receive('make_check_flags').with_args(
-        checks, check_last, prefix
+        '1.2.3', checks, check_last, prefix
     ).and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg', 'check', 'repo'))

+ 9 - 9
tests/unit/borg/test_info.py

@@ -137,16 +137,16 @@ def test_display_archives_info_with_json_calls_borg_with_json_parameter():
     assert json_output == '[]'
 
 
-def test_display_archives_info_with_archive_calls_borg_with_glob_archives_parameter():
+def test_display_archives_info_with_archive_calls_borg_with_match_archives_parameter():
     flexmock(module.flags).should_receive('make_flags').and_return(())
     flexmock(module.flags).should_receive('make_flags').with_args(
-        'glob-archives', 'archive'
-    ).and_return(('--glob-archives', 'archive'))
+        'match-archives', 'archive'
+    ).and_return(('--match-archives', 'archive'))
     flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'info', '--repo', 'repo', '--glob-archives', 'archive'),
+        ('borg', 'info', '--repo', 'repo', '--match-archives', 'archive'),
         output_log_level=logging.WARNING,
         borg_local_path='borg',
         extra_environment=None,
@@ -229,16 +229,16 @@ def test_display_archives_info_with_lock_wait_calls_borg_with_lock_wait_paramete
     )
 
 
-def test_display_archives_info_with_prefix_calls_borg_with_glob_archives_parameters():
+def test_display_archives_info_with_prefix_calls_borg_with_match_archives_parameters():
     flexmock(module.flags).should_receive('make_flags').and_return(())
     flexmock(module.flags).should_receive('make_flags').with_args(
-        'glob-archives', 'foo*'
-    ).and_return(('--glob-archives', 'foo*'))
+        'match-archives', 'sh:foo*'
+    ).and_return(('--match-archives', 'sh:foo*'))
     flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'info', '--glob-archives', 'foo*', '--repo', 'repo'),
+        ('borg', 'info', '--match-archives', 'sh:foo*', '--repo', 'repo'),
         output_log_level=logging.WARNING,
         borg_local_path='borg',
         extra_environment=None,
@@ -252,7 +252,7 @@ def test_display_archives_info_with_prefix_calls_borg_with_glob_archives_paramet
     )
 
 
-@pytest.mark.parametrize('argument_name', ('glob_archives', 'sort_by', 'first', 'last'))
+@pytest.mark.parametrize('argument_name', ('match_archives', 'sort_by', 'first', 'last'))
 def test_display_archives_info_passes_through_arguments_to_borg(argument_name):
     flag_name = f"--{argument_name.replace('_', ' ')}"
     flexmock(module.flags).should_receive('make_flags').and_return(())

+ 11 - 11
tests/unit/borg/test_list.py

@@ -192,7 +192,7 @@ def test_make_list_command_includes_short():
     'argument_name',
     (
         'prefix',
-        'glob_archives',
+        'match_archives',
         'sort_by',
         'first',
         'last',
@@ -260,7 +260,7 @@ def test_list_archive_calls_borg_with_parameters():
         json=False,
         find_paths=None,
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -313,7 +313,7 @@ def test_list_archive_calls_borg_with_local_path():
         json=False,
         find_paths=None,
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -353,7 +353,7 @@ def test_list_archive_calls_borg_multiple_times_with_find_paths():
         json=False,
         find_paths=['foo.txt'],
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -400,7 +400,7 @@ def test_list_archive_calls_borg_with_archive():
         json=False,
         find_paths=None,
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -439,7 +439,7 @@ def test_list_archive_without_archive_delegates_to_list_repository():
         format=None,
         json=None,
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -466,7 +466,7 @@ def test_list_archive_with_borg_features_without_archive_delegates_to_list_repos
         format=None,
         json=None,
         prefix=None,
-        glob_archives=None,
+        match_archives=None,
         sort_by=None,
         first=None,
         last=None,
@@ -487,12 +487,12 @@ def test_list_archive_with_borg_features_without_archive_delegates_to_list_repos
 
 
 @pytest.mark.parametrize(
-    'archive_filter_flag', ('prefix', 'glob_archives', 'sort_by', 'first', 'last',),
+    'archive_filter_flag', ('prefix', 'match_archives', 'sort_by', 'first', 'last',),
 )
 def test_list_archive_with_archive_ignores_archive_filter_flag(archive_filter_flag,):
     default_filter_flags = {
         'prefix': None,
-        'glob_archives': None,
+        'match_archives': None,
         'sort_by': None,
         'first': None,
         'last': None,
@@ -532,14 +532,14 @@ def test_list_archive_with_archive_ignores_archive_filter_flag(archive_filter_fl
 
 
 @pytest.mark.parametrize(
-    'archive_filter_flag', ('prefix', 'glob_archives', 'sort_by', 'first', 'last',),
+    'archive_filter_flag', ('prefix', 'match_archives', 'sort_by', 'first', 'last',),
 )
 def test_list_archive_with_find_paths_allows_archive_filter_flag_but_only_passes_it_to_rlist(
     archive_filter_flag,
 ):
     default_filter_flags = {
         'prefix': None,
-        'glob_archives': None,
+        'match_archives': None,
         'sort_by': None,
         'first': None,
         'last': None,

+ 2 - 2
tests/unit/borg/test_mount.py

@@ -31,11 +31,11 @@ def test_mount_archive_calls_borg_with_required_flags():
     )
 
 
-def test_mount_archive_with_borg_features_calls_borg_with_repository_and_glob_archives_flags():
+def test_mount_archive_with_borg_features_calls_borg_with_repository_and_match_archives_flags():
     flexmock(module.feature).should_receive('available').and_return(True)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',))
     insert_execute_command_mock(
-        ('borg', 'mount', '--repo', 'repo', '--glob-archives', 'archive', '/mnt')
+        ('borg', 'mount', '--repo', 'repo', '--match-archives', 'archive', '/mnt')
     )
 
     module.mount_archive(

+ 46 - 70
tests/unit/borg/test_prune.py

@@ -23,16 +23,29 @@ BASE_PRUNE_FLAGS = (('--keep-daily', '1'), ('--keep-weekly', '2'), ('--keep-mont
 
 def test_make_prune_flags_returns_flags_from_config_plus_default_prefix_glob():
     retention_config = OrderedDict((('keep_daily', 1), ('keep_weekly', 2), ('keep_monthly', 3)))
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-    result = module.make_prune_flags(retention_config)
+    result = module.make_prune_flags(retention_config, local_borg_version='1.2.3')
 
-    assert tuple(result) == BASE_PRUNE_FLAGS + (('--glob-archives', '{hostname}-*'),)
+    assert tuple(result) == BASE_PRUNE_FLAGS + (('--match-archives', 'sh:{hostname}-*'),)
 
 
 def test_make_prune_flags_accepts_prefix_with_placeholders():
     retention_config = OrderedDict((('keep_daily', 1), ('prefix', 'Documents_{hostname}-{now}')))
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-    result = module.make_prune_flags(retention_config)
+    result = module.make_prune_flags(retention_config, local_borg_version='1.2.3')
+
+    expected = (('--keep-daily', '1'), ('--match-archives', 'sh:Documents_{hostname}-{now}*'))
+
+    assert tuple(result) == expected
+
+
+def test_make_prune_flags_with_prefix_without_borg_features_uses_glob_archives():
+    retention_config = OrderedDict((('keep_daily', 1), ('prefix', 'Documents_{hostname}-{now}')))
+    flexmock(module.feature).should_receive('available').and_return(False)
+
+    result = module.make_prune_flags(retention_config, local_borg_version='1.2.3')
 
     expected = (('--keep-daily', '1'), ('--glob-archives', 'Documents_{hostname}-{now}*'))
 
@@ -41,8 +54,9 @@ def test_make_prune_flags_accepts_prefix_with_placeholders():
 
 def test_make_prune_flags_treats_empty_prefix_as_no_prefix():
     retention_config = OrderedDict((('keep_daily', 1), ('prefix', '')))
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-    result = module.make_prune_flags(retention_config)
+    result = module.make_prune_flags(retention_config, local_borg_version='1.2.3')
 
     expected = (('--keep-daily', '1'),)
 
@@ -51,8 +65,9 @@ def test_make_prune_flags_treats_empty_prefix_as_no_prefix():
 
 def test_make_prune_flags_treats_none_prefix_as_no_prefix():
     retention_config = OrderedDict((('keep_daily', 1), ('prefix', None)))
+    flexmock(module.feature).should_receive('available').and_return(True)
 
-    result = module.make_prune_flags(retention_config)
+    result = module.make_prune_flags(retention_config, local_borg_version='1.2.3')
 
     expected = (('--keep-daily', '1'),)
 
@@ -63,10 +78,7 @@ PRUNE_COMMAND = ('borg', 'prune', '--keep-daily', '1', '--keep-weekly', '2', '--
 
 
 def test_prune_archives_calls_borg_with_parameters():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('repo',), logging.INFO)
 
@@ -74,16 +86,13 @@ def test_prune_archives_calls_borg_with_parameters():
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_log_info_calls_borg_with_info_parameter():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--info', 'repo'), logging.INFO)
     insert_logging_mock(logging.INFO)
@@ -92,16 +101,13 @@ def test_prune_archives_with_log_info_calls_borg_with_info_parameter():
         repository='repo',
         storage_config={},
         dry_run=False,
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_log_debug_calls_borg_with_debug_parameter():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--debug', '--show-rc', 'repo'), logging.INFO)
     insert_logging_mock(logging.DEBUG)
@@ -110,16 +116,13 @@ def test_prune_archives_with_log_debug_calls_borg_with_debug_parameter():
         repository='repo',
         storage_config={},
         dry_run=False,
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_dry_run_calls_borg_with_dry_run_parameter():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--dry-run', 'repo'), logging.INFO)
 
@@ -127,16 +130,13 @@ def test_prune_archives_with_dry_run_calls_borg_with_dry_run_parameter():
         repository='repo',
         storage_config={},
         dry_run=True,
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_local_path_calls_borg_via_local_path():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(('borg1',) + PRUNE_COMMAND[1:] + ('repo',), logging.INFO)
 
@@ -144,17 +144,14 @@ def test_prune_archives_with_local_path_calls_borg_via_local_path():
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         local_path='borg1',
     )
 
 
 def test_prune_archives_with_remote_path_calls_borg_with_remote_path_parameters():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--remote-path', 'borg1', 'repo'), logging.INFO)
 
@@ -162,17 +159,14 @@ def test_prune_archives_with_remote_path_calls_borg_with_remote_path_parameters(
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         remote_path='borg1',
     )
 
 
 def test_prune_archives_with_stats_calls_borg_with_stats_parameter_and_warning_output_log_level():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--stats', 'repo'), logging.WARNING)
 
@@ -180,17 +174,14 @@ def test_prune_archives_with_stats_calls_borg_with_stats_parameter_and_warning_o
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         stats=True,
     )
 
 
 def test_prune_archives_with_stats_and_log_info_calls_borg_with_stats_parameter_and_info_output_log_level():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_logging_mock(logging.INFO)
     insert_execute_command_mock(PRUNE_COMMAND + ('--stats', '--info', 'repo'), logging.INFO)
@@ -199,17 +190,14 @@ def test_prune_archives_with_stats_and_log_info_calls_borg_with_stats_parameter_
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         stats=True,
     )
 
 
 def test_prune_archives_with_files_calls_borg_with_list_parameter_and_warning_output_log_level():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--list', 'repo'), logging.WARNING)
 
@@ -217,17 +205,14 @@ def test_prune_archives_with_files_calls_borg_with_list_parameter_and_warning_ou
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         list_archives=True,
     )
 
 
 def test_prune_archives_with_files_and_log_info_calls_borg_with_list_parameter_and_info_output_log_level():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_logging_mock(logging.INFO)
     insert_execute_command_mock(PRUNE_COMMAND + ('--info', '--list', 'repo'), logging.INFO)
@@ -236,7 +221,7 @@ def test_prune_archives_with_files_and_log_info_calls_borg_with_list_parameter_a
         dry_run=False,
         repository='repo',
         storage_config={},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
         list_archives=True,
     )
@@ -244,10 +229,7 @@ def test_prune_archives_with_files_and_log_info_calls_borg_with_list_parameter_a
 
 def test_prune_archives_with_umask_calls_borg_with_umask_parameters():
     storage_config = {'umask': '077'}
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--umask', '077', 'repo'), logging.INFO)
 
@@ -255,17 +237,14 @@ def test_prune_archives_with_umask_calls_borg_with_umask_parameters():
         dry_run=False,
         repository='repo',
         storage_config=storage_config,
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_lock_wait_calls_borg_with_lock_wait_parameters():
     storage_config = {'lock_wait': 5}
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--lock-wait', '5', 'repo'), logging.INFO)
 
@@ -273,16 +252,13 @@ def test_prune_archives_with_lock_wait_calls_borg_with_lock_wait_parameters():
         dry_run=False,
         repository='repo',
         storage_config=storage_config,
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )
 
 
 def test_prune_archives_with_extra_borg_options_calls_borg_with_extra_options():
-    retention_config = flexmock()
-    flexmock(module).should_receive('make_prune_flags').with_args(retention_config).and_return(
-        BASE_PRUNE_FLAGS
-    )
+    flexmock(module).should_receive('make_prune_flags').and_return(BASE_PRUNE_FLAGS)
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
     insert_execute_command_mock(PRUNE_COMMAND + ('--extra', '--options', 'repo'), logging.INFO)
 
@@ -290,6 +266,6 @@ def test_prune_archives_with_extra_borg_options_calls_borg_with_extra_options():
         dry_run=False,
         repository='repo',
         storage_config={'extra_borg_options': {'prune': '--extra --options'}},
-        retention_config=retention_config,
+        retention_config=flexmock(),
         local_borg_version='1.2.3',
     )

+ 8 - 8
tests/unit/borg/test_rlist.py

@@ -41,11 +41,11 @@ def test_resolve_archive_name_calls_borg_with_parameters():
     )
 
 
-def test_resolve_archive_name_with_log_info_calls_borg_with_info_parameter():
+def test_resolve_archive_name_with_log_info_calls_borg_without_info_parameter():
     expected_archive = 'archive-name'
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'list', '--info') + BORG_LIST_LATEST_ARGUMENTS,
+        ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
         output_log_level=None,
         borg_local_path='borg',
         extra_environment=None,
@@ -58,11 +58,11 @@ def test_resolve_archive_name_with_log_info_calls_borg_with_info_parameter():
     )
 
 
-def test_resolve_archive_name_with_log_debug_calls_borg_with_debug_parameter():
+def test_resolve_archive_name_with_log_debug_calls_borg_without_debug_parameter():
     expected_archive = 'archive-name'
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'list', '--debug', '--show-rc') + BORG_LIST_LATEST_ARGUMENTS,
+        ('borg', 'list') + BORG_LIST_LATEST_ARGUMENTS,
         output_log_level=None,
         borg_local_path='borg',
         extra_environment=None,
@@ -273,9 +273,9 @@ def test_make_rlist_command_includes_remote_path():
     assert command == ('borg', 'list', '--remote-path', 'borg2', 'repo')
 
 
-def test_make_rlist_command_transforms_prefix_into_glob_archives():
+def test_make_rlist_command_transforms_prefix_into_match_archives():
     flexmock(module.flags).should_receive('make_flags').and_return(()).and_return(()).and_return(
-        ('--glob-archives', 'foo*')
+        ('--match-archives', 'sh:foo*')
     )
     flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('repo',))
@@ -287,7 +287,7 @@ def test_make_rlist_command_transforms_prefix_into_glob_archives():
         rlist_arguments=flexmock(archive=None, paths=None, json=False, prefix='foo'),
     )
 
-    assert command == ('borg', 'list', '--glob-archives', 'foo*', 'repo')
+    assert command == ('borg', 'list', '--match-archives', 'sh:foo*', 'repo')
 
 
 def test_make_rlist_command_includes_short():
@@ -308,7 +308,7 @@ def test_make_rlist_command_includes_short():
 @pytest.mark.parametrize(
     'argument_name',
     (
-        'glob_archives',
+        'match_archives',
         'sort_by',
         'first',
         'last',

+ 19 - 19
tests/unit/borg/test_transfer.py

@@ -25,7 +25,7 @@ def test_transfer_archives_calls_borg_with_flags():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
     )
 
 
@@ -49,7 +49,7 @@ def test_transfer_archives_with_dry_run_calls_borg_with_dry_run_flag():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
     )
 
 
@@ -70,7 +70,7 @@ def test_transfer_archives_with_log_info_calls_borg_with_info_flag():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
     )
 
 
@@ -92,20 +92,20 @@ def test_transfer_archives_with_log_debug_calls_borg_with_debug_flag():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
     )
 
 
-def test_transfer_archives_with_archive_calls_borg_with_glob_archives_flag():
+def test_transfer_archives_with_archive_calls_borg_with_match_archives_flag():
     flexmock(module.flags).should_receive('make_flags').and_return(())
     flexmock(module.flags).should_receive('make_flags').with_args(
-        'glob-archives', 'archive'
-    ).and_return(('--glob-archives', 'archive'))
+        'match-archives', 'archive'
+    ).and_return(('--match-archives', 'archive'))
     flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'transfer', '--glob-archives', 'archive', '--repo', 'repo'),
+        ('borg', 'transfer', '--match-archives', 'archive', '--repo', 'repo'),
         output_log_level=logging.WARNING,
         borg_local_path='borg',
         extra_environment=None,
@@ -116,20 +116,20 @@ def test_transfer_archives_with_archive_calls_borg_with_glob_archives_flag():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive='archive', glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive='archive', match_archives=None, source_repository=None),
     )
 
 
-def test_transfer_archives_with_glob_archives_calls_borg_with_glob_archives_flag():
+def test_transfer_archives_with_match_archives_calls_borg_with_match_archives_flag():
     flexmock(module.flags).should_receive('make_flags').and_return(())
     flexmock(module.flags).should_receive('make_flags').with_args(
-        'glob-archives', 'foo*'
-    ).and_return(('--glob-archives', 'foo*'))
+        'match-archives', 'sh:foo*'
+    ).and_return(('--match-archives', 'sh:foo*'))
     flexmock(module.flags).should_receive('make_flags_from_arguments').and_return(())
     flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo'))
     flexmock(module.environment).should_receive('make_environment')
     flexmock(module).should_receive('execute_command').with_args(
-        ('borg', 'transfer', '--glob-archives', 'foo*', '--repo', 'repo'),
+        ('borg', 'transfer', '--match-archives', 'sh:foo*', '--repo', 'repo'),
         output_log_level=logging.WARNING,
         borg_local_path='borg',
         extra_environment=None,
@@ -140,7 +140,7 @@ def test_transfer_archives_with_glob_archives_calls_borg_with_glob_archives_flag
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives='foo*', source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives='sh:foo*', source_repository=None),
     )
 
 
@@ -161,7 +161,7 @@ def test_transfer_archives_with_local_path_calls_borg_via_local_path():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
         local_path='borg2',
     )
 
@@ -186,7 +186,7 @@ def test_transfer_archives_with_remote_path_calls_borg_with_remote_path_flags():
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
         remote_path='borg2',
     )
 
@@ -212,7 +212,7 @@ def test_transfer_archives_with_lock_wait_calls_borg_with_lock_wait_flags():
         repository='repo',
         storage_config=storage_config,
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository=None),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository=None),
     )
 
 
@@ -238,7 +238,7 @@ def test_transfer_archives_passes_through_arguments_to_borg(argument_name):
         storage_config={},
         local_borg_version='2.3.4',
         transfer_arguments=flexmock(
-            archive=None, glob_archives=None, source_repository=None, **{argument_name: 'value'}
+            archive=None, match_archives=None, source_repository=None, **{argument_name: 'value'}
         ),
     )
 
@@ -263,5 +263,5 @@ def test_transfer_archives_with_source_repository_calls_borg_with_other_repo_fla
         repository='repo',
         storage_config={},
         local_borg_version='2.3.4',
-        transfer_arguments=flexmock(archive=None, glob_archives=None, source_repository='other'),
+        transfer_arguments=flexmock(archive=None, match_archives=None, source_repository='other'),
     )