|
@@ -59,7 +59,7 @@ def test_any_parent_directories_treats_unrelated_paths_as_non_match():
|
|
|
module.any_parent_directories('/foo/bar.txt', ('/usr', '/etc'))
|
|
|
|
|
|
|
|
|
-def test_collect_special_file_paths_parses_special_files_from_borg_dry_run_file_list():
|
|
|
+def test_validate_planned_backup_paths_parses_borg_dry_run_file_list():
|
|
|
flexmock(module.flags).should_receive('omit_flag').replace_with(
|
|
|
lambda arguments, flag: arguments,
|
|
|
)
|
|
@@ -70,21 +70,25 @@ def test_collect_special_file_paths_parses_special_files_from_borg_dry_run_file_
|
|
|
flexmock(module).should_receive('execute_command_and_capture_output').and_return(
|
|
|
'Processing files ...\n- /foo\n+ /bar\n- /baz',
|
|
|
)
|
|
|
- flexmock(module).should_receive('special_file').and_return(True)
|
|
|
flexmock(module.os.path).should_receive('exists').and_return(False)
|
|
|
- flexmock(module).should_receive('any_parent_directories').never()
|
|
|
+ flexmock(module).should_receive('any_parent_directories').and_return(False)
|
|
|
|
|
|
- assert module.collect_special_file_paths(
|
|
|
+ assert module.validate_planned_backup_paths(
|
|
|
dry_run=False,
|
|
|
create_command=('borg', 'create'),
|
|
|
config={},
|
|
|
+ patterns=(
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/foo'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/bar'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/baz'),
|
|
|
+ ),
|
|
|
local_path=None,
|
|
|
working_directory=None,
|
|
|
borgmatic_runtime_directory='/run/borgmatic',
|
|
|
) == ('/foo', '/bar', '/baz')
|
|
|
|
|
|
|
|
|
-def test_collect_special_file_paths_skips_borgmatic_runtime_directory():
|
|
|
+def test_validate_planned_backup_paths_skips_borgmatic_runtime_directory():
|
|
|
flexmock(module.flags).should_receive('omit_flag').replace_with(
|
|
|
lambda arguments, flag: arguments,
|
|
|
)
|
|
@@ -95,32 +99,29 @@ def test_collect_special_file_paths_skips_borgmatic_runtime_directory():
|
|
|
flexmock(module).should_receive('execute_command_and_capture_output').and_return(
|
|
|
'+ /foo\n- /run/borgmatic/bar\n- /baz',
|
|
|
)
|
|
|
- flexmock(module).should_receive('special_file').and_return(True)
|
|
|
flexmock(module.os.path).should_receive('exists').and_return(True)
|
|
|
- flexmock(module).should_receive('any_parent_directories').with_args(
|
|
|
- '/foo',
|
|
|
- ('/run/borgmatic',),
|
|
|
- ).and_return(False)
|
|
|
- flexmock(module).should_receive('any_parent_directories').with_args(
|
|
|
- '/run/borgmatic/bar',
|
|
|
- ('/run/borgmatic',),
|
|
|
- ).and_return(True)
|
|
|
- flexmock(module).should_receive('any_parent_directories').with_args(
|
|
|
- '/baz',
|
|
|
- ('/run/borgmatic',),
|
|
|
- ).and_return(False)
|
|
|
+ flexmock(module).should_receive('any_parent_directories').replace_with(
|
|
|
+ lambda path, _: path == '/run/borgmatic/bar'
|
|
|
+ )
|
|
|
|
|
|
- assert module.collect_special_file_paths(
|
|
|
+ assert module.validate_planned_backup_paths(
|
|
|
dry_run=False,
|
|
|
create_command=('borg', 'create'),
|
|
|
config={},
|
|
|
+ patterns=(
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/foo'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern(
|
|
|
+ '/run/borgmatic/bar', module.borgmatic.borg.pattern.Pattern_type.ROOT
|
|
|
+ ),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/baz'),
|
|
|
+ ),
|
|
|
local_path=None,
|
|
|
working_directory=None,
|
|
|
borgmatic_runtime_directory='/run/borgmatic',
|
|
|
) == ('/foo', '/baz')
|
|
|
|
|
|
|
|
|
-def test_collect_special_file_paths_with_borgmatic_runtime_directory_missing_from_paths_output_errors():
|
|
|
+def test_validate_planned_backup_paths_with_borgmatic_runtime_directory_missing_from_paths_output_errors():
|
|
|
flexmock(module.flags).should_receive('omit_flag').replace_with(
|
|
|
lambda arguments, flag: arguments,
|
|
|
)
|
|
@@ -131,22 +132,30 @@ def test_collect_special_file_paths_with_borgmatic_runtime_directory_missing_fro
|
|
|
flexmock(module).should_receive('execute_command_and_capture_output').and_return(
|
|
|
'+ /foo\n- /bar\n- /baz',
|
|
|
)
|
|
|
- flexmock(module).should_receive('special_file').and_return(True)
|
|
|
flexmock(module.os.path).should_receive('exists').and_return(True)
|
|
|
- flexmock(module).should_receive('any_parent_directories').and_return(False)
|
|
|
+ flexmock(module).should_receive('any_parent_directories').replace_with(
|
|
|
+ lambda path, _: path == '/run/borgmatic/bar'
|
|
|
+ )
|
|
|
|
|
|
with pytest.raises(ValueError):
|
|
|
- module.collect_special_file_paths(
|
|
|
+ module.validate_planned_backup_paths(
|
|
|
dry_run=False,
|
|
|
create_command=('borg', 'create'),
|
|
|
config={},
|
|
|
+ patterns=(
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/foo'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern(
|
|
|
+ '/run/borgmatic/bar', module.borgmatic.borg.pattern.Pattern_type.ROOT
|
|
|
+ ),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/baz'),
|
|
|
+ ),
|
|
|
local_path=None,
|
|
|
working_directory=None,
|
|
|
borgmatic_runtime_directory='/run/borgmatic',
|
|
|
)
|
|
|
|
|
|
|
|
|
-def test_collect_special_file_paths_with_dry_run_and_borgmatic_runtime_directory_missing_from_paths_output_does_not_raise():
|
|
|
+def test_validate_planned_backup_paths_with_borgmatic_runtime_directory_missing_from_patterns_does_not_raise():
|
|
|
flexmock(module.flags).should_receive('omit_flag').replace_with(
|
|
|
lambda arguments, flag: arguments,
|
|
|
)
|
|
@@ -155,23 +164,28 @@ def test_collect_special_file_paths_with_dry_run_and_borgmatic_runtime_directory
|
|
|
)
|
|
|
flexmock(module.environment).should_receive('make_environment').and_return(None)
|
|
|
flexmock(module).should_receive('execute_command_and_capture_output').and_return(
|
|
|
- '+ /foo\n- /bar\n- /baz',
|
|
|
+ '+ /foo\n- /run/borgmatic/bar\n- /baz',
|
|
|
)
|
|
|
- flexmock(module).should_receive('special_file').and_return(True)
|
|
|
flexmock(module.os.path).should_receive('exists').and_return(True)
|
|
|
- flexmock(module).should_receive('any_parent_directories').and_return(False)
|
|
|
+ flexmock(module).should_receive('any_parent_directories').replace_with(
|
|
|
+ lambda path, _: path == '/run/borgmatic/bar'
|
|
|
+ )
|
|
|
|
|
|
- assert module.collect_special_file_paths(
|
|
|
- dry_run=True,
|
|
|
+ assert module.validate_planned_backup_paths(
|
|
|
+ dry_run=False,
|
|
|
create_command=('borg', 'create'),
|
|
|
config={},
|
|
|
+ patterns=(
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/foo'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/baz'),
|
|
|
+ ),
|
|
|
local_path=None,
|
|
|
working_directory=None,
|
|
|
borgmatic_runtime_directory='/run/borgmatic',
|
|
|
- ) == ('/foo', '/bar', '/baz')
|
|
|
+ ) == ('/foo', '/baz')
|
|
|
|
|
|
|
|
|
-def test_collect_special_file_paths_excludes_non_special_files():
|
|
|
+def test_validate_planned_backup_paths_with_dry_run_and_borgmatic_runtime_directory_missing_from_paths_output_does_not_raise():
|
|
|
flexmock(module.flags).should_receive('omit_flag').replace_with(
|
|
|
lambda arguments, flag: arguments,
|
|
|
)
|
|
@@ -180,22 +194,26 @@ def test_collect_special_file_paths_excludes_non_special_files():
|
|
|
)
|
|
|
flexmock(module.environment).should_receive('make_environment').and_return(None)
|
|
|
flexmock(module).should_receive('execute_command_and_capture_output').and_return(
|
|
|
- '+ /foo\n+ /bar\n+ /baz',
|
|
|
- )
|
|
|
- flexmock(module).should_receive('special_file').and_return(True).and_return(False).and_return(
|
|
|
- True,
|
|
|
+ '+ /foo\n- /run/borgmatic/bar\n- /baz',
|
|
|
)
|
|
|
- flexmock(module.os.path).should_receive('exists').and_return(False)
|
|
|
- flexmock(module).should_receive('any_parent_directories').never()
|
|
|
+ flexmock(module.os.path).should_receive('exists').and_return(True)
|
|
|
+ flexmock(module).should_receive('any_parent_directories').and_return(False)
|
|
|
|
|
|
- assert module.collect_special_file_paths(
|
|
|
- dry_run=False,
|
|
|
+ assert module.validate_planned_backup_paths(
|
|
|
+ dry_run=True,
|
|
|
create_command=('borg', 'create'),
|
|
|
config={},
|
|
|
+ patterns=(
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/foo'),
|
|
|
+ module.borgmatic.borg.pattern.Pattern(
|
|
|
+ '/run/borgmatic/bar', module.borgmatic.borg.pattern.Pattern_type.ROOT
|
|
|
+ ),
|
|
|
+ module.borgmatic.borg.pattern.Pattern('/baz'),
|
|
|
+ ),
|
|
|
local_path=None,
|
|
|
working_directory=None,
|
|
|
borgmatic_runtime_directory='/run/borgmatic',
|
|
|
- ) == ('/foo', '/baz')
|
|
|
+ ) == ('/foo', '/run/borgmatic/bar', '/baz')
|
|
|
|
|
|
|
|
|
DEFAULT_ARCHIVE_NAME = '{hostname}-{now:%Y-%m-%dT%H:%M:%S.%f}'
|
|
@@ -211,6 +229,7 @@ def test_make_base_create_produces_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -246,6 +265,7 @@ def test_make_base_create_command_includes_patterns_file_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -278,6 +298,7 @@ def test_make_base_create_command_with_store_config_false_omits_config_files():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -346,6 +367,7 @@ def test_make_base_create_command_includes_configuration_option_as_command_flag(
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -378,6 +400,7 @@ def test_make_base_create_command_includes_dry_run_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=True,
|
|
@@ -410,6 +433,7 @@ def test_make_base_create_command_includes_comment_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -443,6 +467,7 @@ def test_make_base_create_command_includes_local_path_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -475,6 +500,7 @@ def test_make_base_create_command_includes_remote_path_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -507,6 +533,7 @@ def test_make_base_create_command_includes_log_json_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -539,6 +566,7 @@ def test_make_base_create_command_includes_list_flags_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -578,7 +606,18 @@ def test_make_base_create_command_with_stream_processes_ignores_read_special_fal
|
|
|
)
|
|
|
flexmock(module.logger).should_receive('warning').twice()
|
|
|
flexmock(module.environment).should_receive('make_environment')
|
|
|
- flexmock(module).should_receive('collect_special_file_paths').and_return(('/dev/null',)).once()
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(
|
|
|
+ (
|
|
|
+ '/non/special',
|
|
|
+ '/dev/null',
|
|
|
+ )
|
|
|
+ )
|
|
|
+ flexmock(module).should_receive('special_file').with_args(
|
|
|
+ '/non/special', working_directory=None
|
|
|
+ ).and_return(False)
|
|
|
+ flexmock(module).should_receive('special_file').with_args(
|
|
|
+ '/dev/null', working_directory=None
|
|
|
+ ).and_return(True)
|
|
|
flexmock(module.borgmatic.borg.pattern).should_receive('write_patterns_file').with_args(
|
|
|
(
|
|
|
Pattern(
|
|
@@ -630,7 +669,18 @@ def test_make_base_create_command_without_patterns_and_with_stream_processes_ign
|
|
|
)
|
|
|
flexmock(module.logger).should_receive('warning').twice()
|
|
|
flexmock(module.environment).should_receive('make_environment')
|
|
|
- flexmock(module).should_receive('collect_special_file_paths').and_return(('/dev/null',)).once()
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(
|
|
|
+ (
|
|
|
+ '/non/special',
|
|
|
+ '/dev/null',
|
|
|
+ )
|
|
|
+ )
|
|
|
+ flexmock(module).should_receive('special_file').with_args(
|
|
|
+ '/non/special', working_directory=None
|
|
|
+ ).and_return(False)
|
|
|
+ flexmock(module).should_receive('special_file').with_args(
|
|
|
+ '/dev/null', working_directory=None
|
|
|
+ ).and_return(True)
|
|
|
flexmock(module.borgmatic.borg.pattern).should_receive('write_patterns_file').with_args(
|
|
|
(
|
|
|
Pattern(
|
|
@@ -678,7 +728,7 @@ def test_make_base_create_command_with_stream_processes_and_read_special_true_sk
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
flexmock(module.logger).should_receive('warning').never()
|
|
|
- flexmock(module).should_receive('collect_special_file_paths').never()
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -712,6 +762,7 @@ def test_make_base_create_command_includes_archive_name_format_in_borg_command()
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
('repo::ARCHIVE_NAME',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -744,6 +795,7 @@ def test_make_base_create_command_includes_default_archive_name_format_in_borg_c
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
('repo::{hostname}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -775,6 +827,7 @@ def test_make_base_create_command_includes_archive_name_format_with_placeholders
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(repository_archive_pattern,),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -807,6 +860,7 @@ def test_make_base_create_command_includes_repository_and_archive_name_format_wi
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(repository_archive_pattern,),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -835,6 +889,7 @@ def test_make_base_create_command_includes_archive_suffix_in_borg_command():
|
|
|
DEFAULT_ARCHIVE_NAME,
|
|
|
)
|
|
|
flexmock(module.borgmatic.borg.flags).should_receive('make_exclude_flags').and_return(())
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|
|
@@ -867,6 +922,7 @@ def test_make_base_create_command_includes_extra_borg_options_in_borg_command():
|
|
|
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
|
|
|
(f'repo::{DEFAULT_ARCHIVE_NAME}',),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('validate_planned_backup_paths').and_return(())
|
|
|
|
|
|
(create_flags, create_positional_arguments, pattern_file) = module.make_base_create_command(
|
|
|
dry_run=False,
|