If a "prefix" option in borgmatic's configuration has an empty value (blank or ""), then disable default prefix.

This commit is contained in:
Dan Helfman 2019-07-27 14:04:13 -07:00
parent e25f2c4e6c
commit 39e5aac479
8 changed files with 61 additions and 22 deletions

5
NEWS
View file

@ -1,6 +1,9 @@
1.3.13.dev0 1.3.13
* #199: Add note to documentation about using spaces instead of tabs for indentation, as YAML does * #199: Add note to documentation about using spaces instead of tabs for indentation, as YAML does
not allow tabs. not allow tabs.
* #203: Fix compatibility with ruamel.yaml 0.16.x.
* If a "prefix" option in borgmatic's configuration has an empty value (blank or ""), then disable
default prefix.
1.3.12 1.3.12
* Only log to syslog when run from a non-interactive console (e.g. a cron job). * Only log to syslog when run from a non-interactive console (e.g. a cron job).

View file

@ -55,7 +55,7 @@ def _make_check_flags(checks, check_last=None, prefix=None):
''' '''
if 'archives' in checks: if 'archives' in checks:
last_flags = ('--last', str(check_last)) if check_last else () last_flags = ('--last', str(check_last)) if check_last else ()
prefix_flags = ('--prefix', prefix) if prefix else ('--prefix', DEFAULT_PREFIX) prefix_flags = ('--prefix', prefix) if prefix else ()
else: else:
last_flags = () last_flags = ()
prefix_flags = () prefix_flags = ()
@ -102,7 +102,7 @@ def check_archives(
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
verbosity_flags = ('--debug', '--show-rc') verbosity_flags = ('--debug', '--show-rc')
prefix = consistency_config.get('prefix') prefix = consistency_config.get('prefix', DEFAULT_PREFIX)
full_command = ( full_command = (
(local_path, 'check', repository) (local_path, 'check', repository)

View file

@ -21,12 +21,15 @@ def _make_prune_flags(retention_config):
('--keep-monthly', '6'), ('--keep-monthly', '6'),
) )
''' '''
if not retention_config.get('prefix'): config = dict(retention_config)
retention_config['prefix'] = '{hostname}-'
if 'prefix' not in config:
config['prefix'] = '{hostname}-'
elif not config['prefix']:
config.pop('prefix')
return ( return (
('--' + option_name.replace('_', '-'), str(retention_config[option_name])) ('--' + option_name.replace('_', '-'), str(value)) for option_name, value in config.items()
for option_name, value in retention_config.items()
) )

View file

@ -269,7 +269,7 @@ map:
desc: | desc: |
When pruning, only consider archive names starting with this prefix. When pruning, only consider archive names starting with this prefix.
Borg placeholders can be used. See the output of "borg help placeholders" for Borg placeholders can be used. See the output of "borg help placeholders" for
details. Defaults to "{hostname}-". details. Defaults to "{hostname}-". Use an empty value to disable the default.
example: sourcehostname example: sourcehostname
consistency: consistency:
desc: | desc: |
@ -311,7 +311,8 @@ map:
desc: | desc: |
When performing the "archives" check, only consider archive names starting with When performing the "archives" check, only consider archive names starting with
this prefix. Borg placeholders can be used. See the output of this prefix. Borg placeholders can be used. See the output of
"borg help placeholders" for details. Defaults to "{hostname}-". "borg help placeholders" for details. Defaults to "{hostname}-". Use an empty
value to disable the default.
example: sourcehostname example: sourcehostname
output: output:
desc: | desc: |

View file

@ -1,6 +1,6 @@
from setuptools import find_packages, setup from setuptools import find_packages, setup
VERSION = '1.3.13.dev0' VERSION = '1.3.13'
setup( setup(
@ -31,7 +31,7 @@ setup(
obsoletes=['atticmatic'], obsoletes=['atticmatic'],
install_requires=( install_requires=(
'pykwalify>=1.6.0,<14.06', 'pykwalify>=1.6.0,<14.06',
'ruamel.yaml>0.15.0,<0.16.0', 'ruamel.yaml>0.15.0,<0.17.0',
'setuptools', 'setuptools',
'colorama>=0.4.1,<0.5', 'colorama>=0.4.1,<0.5',
), ),

View file

@ -20,5 +20,5 @@ pytest==4.6.3
pytest-cov==2.7.1 pytest-cov==2.7.1
python-dateutil==2.8.0 python-dateutil==2.8.0
PyYAML==5.1.1 PyYAML==5.1.1
ruamel.yaml>0.15.0,<0.16.0 ruamel.yaml>0.15.0,<0.17.0
toml==0.10.0 toml==0.10.0

View file

@ -52,14 +52,14 @@ def test_make_check_flags_with_extract_omits_extract_flag():
assert flags == () assert flags == ()
def test_make_check_flags_with_default_checks_returns_default_flags(): def test_make_check_flags_with_default_checks_and_default_prefix_returns_default_flags():
flags = module._make_check_flags(module.DEFAULT_CHECKS) flags = module._make_check_flags(module.DEFAULT_CHECKS, prefix=module.DEFAULT_PREFIX)
assert flags == ('--prefix', module.DEFAULT_PREFIX) assert flags == ('--prefix', module.DEFAULT_PREFIX)
def test_make_check_flags_with_all_checks_returns_default_flags(): def test_make_check_flags_with_all_checks_and_default_prefix_returns_default_flags():
flags = module._make_check_flags(module.DEFAULT_CHECKS + ('extract',)) flags = module._make_check_flags(module.DEFAULT_CHECKS + ('extract',), prefix=module.DEFAULT_PREFIX)
assert flags == ('--prefix', module.DEFAULT_PREFIX) assert flags == ('--prefix', module.DEFAULT_PREFIX)
@ -67,7 +67,7 @@ def test_make_check_flags_with_all_checks_returns_default_flags():
def test_make_check_flags_with_archives_check_and_last_includes_last_flag(): def test_make_check_flags_with_archives_check_and_last_includes_last_flag():
flags = module._make_check_flags(('archives',), check_last=3) flags = module._make_check_flags(('archives',), check_last=3)
assert flags == ('--archives-only', '--last', '3', '--prefix', module.DEFAULT_PREFIX) assert flags == ('--archives-only', '--last', '3')
def test_make_check_flags_with_repository_check_and_last_omits_last_flag(): def test_make_check_flags_with_repository_check_and_last_omits_last_flag():
@ -79,7 +79,7 @@ def test_make_check_flags_with_repository_check_and_last_omits_last_flag():
def test_make_check_flags_with_default_checks_and_last_includes_last_flag(): def test_make_check_flags_with_default_checks_and_last_includes_last_flag():
flags = module._make_check_flags(module.DEFAULT_CHECKS, check_last=3) flags = module._make_check_flags(module.DEFAULT_CHECKS, check_last=3)
assert flags == ('--last', '3', '--prefix', module.DEFAULT_PREFIX) assert flags == ('--last', '3')
def test_make_check_flags_with_archives_check_and_prefix_includes_prefix_flag(): def test_make_check_flags_with_archives_check_and_prefix_includes_prefix_flag():
@ -88,6 +88,18 @@ def test_make_check_flags_with_archives_check_and_prefix_includes_prefix_flag():
assert flags == ('--archives-only', '--prefix', 'foo-') assert flags == ('--archives-only', '--prefix', 'foo-')
def test_make_check_flags_with_archives_check_and_empty_prefix_omits_prefix_flag():
flags = module._make_check_flags(('archives',), prefix='')
assert flags == ('--archives-only',)
def test_make_check_flags_with_archives_check_and_none_prefix_omits_prefix_flag():
flags = module._make_check_flags(('archives',), prefix=None)
assert flags == ('--archives-only',)
def test_make_check_flags_with_repository_check_and_prefix_omits_prefix_flag(): def test_make_check_flags_with_repository_check_and_prefix_omits_prefix_flag():
flags = module._make_check_flags(('repository',), prefix='foo-') flags = module._make_check_flags(('repository',), prefix='foo-')
@ -114,7 +126,7 @@ def test_check_archives_calls_borg_with_parameters(checks):
consistency_config = {'check_last': check_last} consistency_config = {'check_last': check_last}
flexmock(module).should_receive('_parse_checks').and_return(checks) flexmock(module).should_receive('_parse_checks').and_return(checks)
flexmock(module).should_receive('_make_check_flags').with_args( flexmock(module).should_receive('_make_check_flags').with_args(
checks, check_last, None checks, check_last, module.DEFAULT_PREFIX
).and_return(()) ).and_return(())
insert_execute_command_mock(('borg', 'check', 'repo')) insert_execute_command_mock(('borg', 'check', 'repo'))
@ -179,7 +191,7 @@ def test_check_archives_with_local_path_calls_borg_via_local_path():
consistency_config = {'check_last': check_last} consistency_config = {'check_last': check_last}
flexmock(module).should_receive('_parse_checks').and_return(checks) flexmock(module).should_receive('_parse_checks').and_return(checks)
flexmock(module).should_receive('_make_check_flags').with_args( flexmock(module).should_receive('_make_check_flags').with_args(
checks, check_last, None checks, check_last, module.DEFAULT_PREFIX
).and_return(()) ).and_return(())
insert_execute_command_mock(('borg1', 'check', 'repo')) insert_execute_command_mock(('borg1', 'check', 'repo'))
@ -197,7 +209,7 @@ def test_check_archives_with_remote_path_calls_borg_with_remote_path_parameters(
consistency_config = {'check_last': check_last} consistency_config = {'check_last': check_last}
flexmock(module).should_receive('_parse_checks').and_return(checks) flexmock(module).should_receive('_parse_checks').and_return(checks)
flexmock(module).should_receive('_make_check_flags').with_args( flexmock(module).should_receive('_make_check_flags').with_args(
checks, check_last, None checks, check_last, module.DEFAULT_PREFIX
).and_return(()) ).and_return(())
insert_execute_command_mock(('borg', 'check', 'repo', '--remote-path', 'borg1')) insert_execute_command_mock(('borg', 'check', 'repo', '--remote-path', 'borg1'))
@ -215,7 +227,7 @@ def test_check_archives_with_lock_wait_calls_borg_with_lock_wait_parameters():
consistency_config = {'check_last': check_last} consistency_config = {'check_last': check_last}
flexmock(module).should_receive('_parse_checks').and_return(checks) flexmock(module).should_receive('_parse_checks').and_return(checks)
flexmock(module).should_receive('_make_check_flags').with_args( flexmock(module).should_receive('_make_check_flags').with_args(
checks, check_last, None checks, check_last, module.DEFAULT_PREFIX
).and_return(()) ).and_return(())
insert_execute_command_mock(('borg', 'check', 'repo', '--lock-wait', '5')) insert_execute_command_mock(('borg', 'check', 'repo', '--lock-wait', '5'))

View file

@ -33,6 +33,26 @@ def test_make_prune_flags_accepts_prefix_with_placeholders():
assert tuple(result) == expected assert tuple(result) == expected
def test_make_prune_flags_treats_empty_prefix_as_no_prefix():
retention_config = OrderedDict((('keep_daily', 1), ('prefix', '')))
result = module._make_prune_flags(retention_config)
expected = (('--keep-daily', '1'),)
assert tuple(result) == expected
def test_make_prune_flags_treats_none_prefix_as_no_prefix():
retention_config = OrderedDict((('keep_daily', 1), ('prefix', None)))
result = module._make_prune_flags(retention_config)
expected = (('--keep-daily', '1'),)
assert tuple(result) == expected
PRUNE_COMMAND = ( PRUNE_COMMAND = (
'borg', 'borg',
'prune', 'prune',