From 2716d9d0b0980af80a2840abff40573d703f1306 Mon Sep 17 00:00:00 2001 From: Vandal <86826719+VandalByte@users.noreply.github.com> Date: Sat, 29 Mar 2025 23:25:50 +0530 Subject: [PATCH] add to schema --- borgmatic/config/schema.yaml | 18 ++++ tests/unit/borg/test_recreate.py | 158 ++++++++++++++++++++++++++++++- 2 files changed, 173 insertions(+), 3 deletions(-) diff --git a/borgmatic/config/schema.yaml b/borgmatic/config/schema.yaml index 9fb8f361..9d622b31 100644 --- a/borgmatic/config/schema.yaml +++ b/borgmatic/config/schema.yaml @@ -284,6 +284,24 @@ properties: http://borgbackup.readthedocs.io/en/stable/usage/create.html for details. Defaults to "lz4". example: lz4 + recompress: + type: string + enum: ['if-different', 'always', 'never'] + description: | + Mode for recompressing data chunks according to MODE. + Possible modes are: + - "if-different": Recompress if the current compression + is with a different compression algorithm. + - "always": Recompress even if the current compression + is with the same compression algorithm. Use this to change + the compression level. + - "never": Do not recompress. Use this option to explicitly + prevent recompression. + See https://borgbackup.readthedocs.io/en/stable/usage/recreate.html + for details. + Not passing --recompress is equivalent to "--recompress never". + Defaults to "if-different". + example: if-different upload_rate_limit: type: integer description: | diff --git a/tests/unit/borg/test_recreate.py b/tests/unit/borg/test_recreate.py index 5ec0eeaf..fe2739b7 100644 --- a/tests/unit/borg/test_recreate.py +++ b/tests/unit/borg/test_recreate.py @@ -7,9 +7,6 @@ from borgmatic.borg import recreate as module from ..test_verbosity import insert_logging_mock -# from borgmatic.borg.pattern import Pattern, Pattern_type, Pattern_style, Pattern_source -# from borgmatic.borg.create import make_exclude_flags, make_list_filter_flags - def insert_execute_command_mock(command, working_directory=None, borg_exit_codes=None): flexmock(module.borgmatic.borg.environment).should_receive('make_environment') @@ -23,7 +20,21 @@ def insert_execute_command_mock(command, working_directory=None, borg_exit_codes ).once() +def mock_dependencies(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) + + def test_recreate_archive_dry_run_skips_execution(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) flexmock(module.borgmatic.borg.flags).should_receive( 'make_repository_archive_flags' ).and_return(('repo::archive',)) @@ -52,6 +63,13 @@ def test_recreate_archive_dry_run_skips_execution(): def test_recreate_calls_borg_with_required_flags(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', 'repo::archive')) module.recreate_archive( @@ -74,6 +92,13 @@ def test_recreate_calls_borg_with_required_flags(): def test_recreate_with_remote_path(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--remote-path', 'borg1', 'repo::archive')) module.recreate_archive( @@ -96,6 +121,13 @@ def test_recreate_with_remote_path(): def test_recreate_with_lock_wait(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--lock-wait', '5', 'repo::archive')) module.recreate_archive( @@ -117,6 +149,13 @@ def test_recreate_with_lock_wait(): def test_recreate_with_log_info(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--info', 'repo::archive')) insert_logging_mock(logging.INFO) @@ -140,6 +179,13 @@ def test_recreate_with_log_info(): def test_recreate_with_log_debug(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--debug', '--show-rc', 'repo::archive')) insert_logging_mock(logging.DEBUG) @@ -162,6 +208,13 @@ def test_recreate_with_log_debug(): def test_recreate_with_log_json(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--log-json', 'repo::archive')) module.recreate_archive( @@ -183,6 +236,12 @@ def test_recreate_with_log_json(): def test_recreate_with_list_filter_flags(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) flexmock(module).should_receive('make_list_filter_flags').and_return('AME+-') insert_execute_command_mock( ('borg', 'recreate', '--list', '--filter', 'AME+-', 'repo::archive') @@ -207,6 +266,12 @@ def test_recreate_with_list_filter_flags(): def test_recreate_with_patterns_from_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) mock_patterns_file = flexmock(name='patterns_file') flexmock(module).should_receive('write_patterns_file').and_return(mock_patterns_file) insert_execute_command_mock( @@ -232,6 +297,12 @@ def test_recreate_with_patterns_from_flag(): def test_recreate_with_exclude_flags(): + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) flexmock(module).should_receive('make_exclude_flags').and_return(('--exclude', 'pattern')) insert_execute_command_mock(('borg', 'recreate', '--exclude', 'pattern', 'repo::archive')) @@ -254,6 +325,13 @@ def test_recreate_with_exclude_flags(): def test_recreate_with_target_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--target', 'new-archive', 'repo::archive')) module.recreate_archive( @@ -275,6 +353,13 @@ def test_recreate_with_target_flag(): def test_recreate_with_comment_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock( ('borg', 'recreate', '--comment', shlex.quote('This is a test comment'), 'repo::archive') ) @@ -298,6 +383,13 @@ def test_recreate_with_comment_flag(): def test_recreate_with_timestamp_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock( ('borg', 'recreate', '--timestamp', '2023-10-01T12:00:00', 'repo::archive') ) @@ -321,6 +413,13 @@ def test_recreate_with_timestamp_flag(): def test_recreate_with_compression_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--compression', 'lz4', 'repo::archive')) module.recreate_archive( @@ -342,6 +441,13 @@ def test_recreate_with_compression_flag(): def test_recreate_with_chunker_params_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock( ('borg', 'recreate', '--chunker-params', '19,23,21,4095', 'repo::archive') ) @@ -365,6 +471,13 @@ def test_recreate_with_chunker_params_flag(): def test_recreate_with_recompress_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--recompress', 'always', 'repo::archive')) module.recreate_archive( @@ -386,6 +499,13 @@ def test_recreate_with_recompress_flag(): def test_recreate_with_match_archives_star(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', 'repo::archive')) module.recreate_archive( @@ -407,6 +527,13 @@ def test_recreate_with_match_archives_star(): def test_recreate_with_match_archives_regex(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', 'repo::archive')) module.recreate_archive( @@ -428,6 +555,13 @@ def test_recreate_with_match_archives_regex(): def test_recreate_with_match_archives_shell(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return(()) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', 'repo::archive')) module.recreate_archive( @@ -449,6 +583,15 @@ def test_recreate_with_match_archives_shell(): def test_recreate_with_glob_archives_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return( + ('--glob-archives', 'foo-*') + ) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('repo::archive',)) insert_execute_command_mock(('borg', 'recreate', '--glob-archives', 'foo-*', 'repo::archive')) module.recreate_archive( @@ -470,6 +613,15 @@ def test_recreate_with_glob_archives_flag(): def test_recreate_with_match_archives_flag(): + flexmock(module.borgmatic.borg.create).should_receive('make_exclude_flags').and_return(()) + flexmock(module.borgmatic.borg.create).should_receive('write_patterns_file').and_return(None) + flexmock(module.borgmatic.borg.create).should_receive('make_list_filter_flags').and_return('') + flexmock(module.borgmatic.borg.flags).should_receive('make_match_archives_flags').and_return( + ('--match-archives', 'sh:foo-*') + ) + flexmock(module.borgmatic.borg.flags).should_receive( + 'make_repository_archive_flags' + ).and_return(('--repo', 'repo', 'archive')) insert_execute_command_mock( ('borg', 'recreate', '--match-archives', 'sh:foo-*', '--repo', 'repo', 'archive') )