From 2774c2e4c03038a045e89ed91f089ed2fc4d6206 Mon Sep 17 00:00:00 2001 From: Dan Helfman Date: Mon, 3 Oct 2022 22:50:37 -0700 Subject: [PATCH] Add support for Borg 2's "--match-archives" flag (replaces "--glob-archives") (#591). --- NEWS | 2 + borgmatic/borg/check.py | 20 ++-- borgmatic/borg/feature.py | 2 + borgmatic/borg/info.py | 14 ++- borgmatic/borg/list.py | 6 +- borgmatic/borg/mount.py | 6 +- borgmatic/borg/prune.py | 16 ++- borgmatic/borg/rlist.py | 8 +- borgmatic/borg/transfer.py | 8 +- borgmatic/commands/arguments.py | 30 +++-- docs/how-to/inspect-your-backups.md | 2 +- scripts/find-unsupported-borg-options | 1 + tests/integration/commands/test_arguments.py | 14 +-- tests/unit/borg/test_check.py | 98 +++++++++++----- tests/unit/borg/test_info.py | 18 +-- tests/unit/borg/test_list.py | 22 ++-- tests/unit/borg/test_mount.py | 4 +- tests/unit/borg/test_prune.py | 116 ++++++++----------- tests/unit/borg/test_rlist.py | 16 +-- tests/unit/borg/test_transfer.py | 38 +++--- 20 files changed, 251 insertions(+), 190 deletions(-) diff --git a/NEWS b/NEWS index 56126cb2f..62002e81c 100644 --- a/NEWS +++ b/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 diff --git a/borgmatic/borg/check.py b/borgmatic/borg/check.py index e3dd0c32b..f1c860b6a 100644 --- a/borgmatic/borg/check.py +++ b/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 diff --git a/borgmatic/borg/feature.py b/borgmatic/borg/feature.py index 0b77eb75b..ab1da97b9 100644 --- a/borgmatic/borg/feature.py +++ b/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 } diff --git a/borgmatic/borg/info.py b/borgmatic/borg/info.py index 9da1e0aed..cea360794 100644 --- a/borgmatic/borg/info.py +++ b/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( diff --git a/borgmatic/borg/list.py b/borgmatic/borg/list.py index 360f5979b..c426ab342 100644 --- a/borgmatic/borg/list.py +++ b/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, diff --git a/borgmatic/borg/mount.py b/borgmatic/borg/mount.py index c1ad1c3d1..92d689b21 100644 --- a/borgmatic/borg/mount.py +++ b/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 ( diff --git a/borgmatic/borg/prune.py b/borgmatic/borg/prune.py index d2c5533ef..7ddef2568 100644 --- a/borgmatic/borg/prune.py +++ b/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 ()) diff --git a/borgmatic/borg/rlist.py b/borgmatic/borg/rlist.py index c2e9299db..e64e35350 100644 --- a/borgmatic/borg/rlist.py +++ b/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 () ) diff --git a/borgmatic/borg/transfer.py b/borgmatic/borg/transfer.py index 8647fb9b9..00ad0209d 100644 --- a/borgmatic/borg/transfer.py +++ b/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) diff --git a/borgmatic/commands/arguments.py b/borgmatic/commands/arguments.py index c3676d2c1..e96029d02 100644 --- a/borgmatic/commands/arguments.py +++ b/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 diff --git a/docs/how-to/inspect-your-backups.md b/docs/how-to/inspect-your-backups.md index ffdc72015..bace6ad96 100644 --- a/docs/how-to/inspect-your-backups.md +++ b/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 diff --git a/scripts/find-unsupported-borg-options b/scripts/find-unsupported-borg-options index 9221e72da..1093b0934 100755 --- a/scripts/find-unsupported-borg-options +++ b/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' \ diff --git a/tests/integration/commands/test_arguments.py b/tests/integration/commands/test_arguments.py index 00c8f65fb..f2d204918 100644 --- a/tests/integration/commands/test_arguments.py +++ b/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(): diff --git a/tests/unit/borg/test_check.py b/tests/unit/borg/test_check.py index 60bfcefbc..29fc4a766 100644 --- a/tests/unit/borg/test_check.py +++ b/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( - ('repository', 'archives', 'extract'), prefix=module.DEFAULT_PREFIX + '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( + '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) - assert flags == ('--archives-only', '--glob-archives', 'foo-*') + flags = module.make_check_flags('1.2.3', ('archives',), prefix='foo-') + + assert flags == ('--archives-only', '--match-archives', 'sh:foo-*') -def test_make_check_flags_with_archives_check_and_empty_prefix_omits_glob_archives_flag(): - flags = module.make_check_flags(('archives',), prefix='') +def test_make_check_flags_with_archives_check_and_empty_prefix_omits_match_archives_flag(): + flexmock(module.feature).should_receive('available').and_return(True) + + 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) - assert flags == ('--glob-archives', 'foo-*') + flags = module.make_check_flags('1.2.3', ('repository', 'archives'), prefix='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')) diff --git a/tests/unit/borg/test_info.py b/tests/unit/borg/test_info.py index 58e6a8861..140bed619 100644 --- a/tests/unit/borg/test_info.py +++ b/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(()) diff --git a/tests/unit/borg/test_list.py b/tests/unit/borg/test_list.py index 0019d9798..8ce32fc98 100644 --- a/tests/unit/borg/test_list.py +++ b/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, diff --git a/tests/unit/borg/test_mount.py b/tests/unit/borg/test_mount.py index 98bbe1a67..7f2060fa6 100644 --- a/tests/unit/borg/test_mount.py +++ b/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( diff --git a/tests/unit/borg/test_prune.py b/tests/unit/borg/test_prune.py index 726128077..9daf59fea 100644 --- a/tests/unit/borg/test_prune.py +++ b/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', ) diff --git a/tests/unit/borg/test_rlist.py b/tests/unit/borg/test_rlist.py index d16b53db7..d6ece7b5d 100644 --- a/tests/unit/borg/test_rlist.py +++ b/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', diff --git a/tests/unit/borg/test_transfer.py b/tests/unit/borg/test_transfer.py index 7e605639b..0794ef491 100644 --- a/tests/unit/borg/test_transfer.py +++ b/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'), )