فهرست منبع

Update export-tar action for Borg 2 support (#557).

Dan Helfman 2 سال پیش
والد
کامیت
d807ce095e
4فایلهای تغییر یافته به همراه69 افزوده شده و 10 حذف شده
  1. 5 4
      NEWS
  2. 11 6
      borgmatic/borg/export_tar.py
  3. 1 0
      borgmatic/commands/borgmatic.py
  4. 52 0
      tests/unit/borg/test_export_tar.py

+ 5 - 4
NEWS

@@ -1,8 +1,9 @@
 1.7.0.dev0
- * #557: Support for Borg 2 while still working with Borg 1. If you install Borg 2, you'll need to
-   manually "borg transfer" or "borgmatic transfer" any existing Borg 1 repositories before use. See
-   the Borg 2.0 changelog summary for more information about Borg 2:
-   https://www.borgbackup.org/releases/borg-2.0.html
+ * #557: Support for Borg 2 while still working with Borg 1. This includes new borgmatic actions
+   like "rcreate" (replaces "init"), "rlist" (list archives in repository), and "rinfo" (show
+   repository info). If you install Borg 2, you'll need to manually "borg transfer" or "borgmatic
+   transfer" your existing Borg 1 repositories before use. See the Borg 2.0 changelog for more
+   information about Borg 2: https://www.borgbackup.org/releases/borg-2.0.html
  * #565: Fix handling of "repository" and "data" consistency checks to prevent invalid Borg flags.
  * #566: Modify "mount" and "extract" actions to require the "--repository" flag when multiple
    repositories are configured.

+ 11 - 6
borgmatic/borg/export_tar.py

@@ -1,7 +1,7 @@
 import logging
 import os
 
-from borgmatic.borg import environment
+from borgmatic.borg import environment, flags
 from borgmatic.execute import DO_NOT_CAPTURE, execute_command
 
 logger = logging.getLogger(__name__)
@@ -14,6 +14,7 @@ def export_tar_archive(
     paths,
     destination_path,
     storage_config,
+    local_borg_version,
     local_path='borg',
     remote_path=None,
     tar_filter=None,
@@ -22,10 +23,10 @@ def export_tar_archive(
 ):
     '''
     Given a dry-run flag, a local or remote repository path, an archive name, zero or more paths to
-    export from the archive, a destination path to export to, a storage configuration dict, optional
-    local and remote Borg paths, an optional filter program, whether to include per-file details,
-    and an optional number of path components to strip, export the archive into the given
-    destination path as a tar-formatted file.
+    export from the archive, a destination path to export to, a storage configuration dict, the
+    local Borg version, optional local and remote Borg paths, an optional filter program, whether to
+    include per-file details, and an optional number of path components to strip, export the archive
+    into the given destination path as a tar-formatted file.
 
     If the destination path is "-", then stream the output to stdout instead of to a file.
     '''
@@ -43,7 +44,11 @@ def export_tar_archive(
         + (('--dry-run',) if dry_run else ())
         + (('--tar-filter', tar_filter) if tar_filter else ())
         + (('--strip-components', str(strip_components)) if strip_components else ())
-        + ('::'.join((repository if ':' in repository else os.path.abspath(repository), archive)),)
+        + flags.make_repository_archive_flags(
+            repository if ':' in repository else os.path.abspath(repository),
+            archive,
+            local_borg_version,
+        )
         + (destination_path,)
         + (tuple(paths) if paths else ())
     )

+ 1 - 0
borgmatic/commands/borgmatic.py

@@ -484,6 +484,7 @@ def run_actions(
                 arguments['export-tar'].paths,
                 arguments['export-tar'].destination,
                 storage,
+                local_borg_version,
                 local_path=local_path,
                 remote_path=remote_path,
                 tar_filter=arguments['export-tar'].tar_filter,

+ 52 - 0
tests/unit/borg/test_export_tar.py

@@ -21,6 +21,9 @@ def insert_execute_command_mock(
 
 
 def test_export_tar_archive_calls_borg_with_path_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', 'repo::archive', 'test.tar', 'path1', 'path2')
@@ -33,10 +36,14 @@ def test_export_tar_archive_calls_borg_with_path_parameters():
         paths=['path1', 'path2'],
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_calls_borg_with_local_path_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg1', 'export-tar', 'repo::archive', 'test.tar'), borg_local_path='borg1'
@@ -49,11 +56,15 @@ def test_export_tar_archive_calls_borg_with_local_path_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
         local_path='borg1',
     )
 
 
 def test_export_tar_archive_calls_borg_with_remote_path_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--remote-path', 'borg1', 'repo::archive', 'test.tar')
@@ -66,11 +77,15 @@ def test_export_tar_archive_calls_borg_with_remote_path_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
         remote_path='borg1',
     )
 
 
 def test_export_tar_archive_calls_borg_with_umask_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--umask', '0770', 'repo::archive', 'test.tar')
@@ -83,10 +98,14 @@ def test_export_tar_archive_calls_borg_with_umask_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={'umask': '0770'},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_calls_borg_with_lock_wait_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--lock-wait', '5', 'repo::archive', 'test.tar')
@@ -99,10 +118,14 @@ def test_export_tar_archive_calls_borg_with_lock_wait_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={'lock_wait': '5'},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_with_log_info_calls_borg_with_info_parameter():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(('borg', 'export-tar', '--info', 'repo::archive', 'test.tar'))
     insert_logging_mock(logging.INFO)
@@ -114,10 +137,14 @@ def test_export_tar_archive_with_log_info_calls_borg_with_info_parameter():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_with_log_debug_calls_borg_with_debug_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--debug', '--show-rc', 'repo::archive', 'test.tar')
@@ -131,10 +158,14 @@ def test_export_tar_archive_with_log_debug_calls_borg_with_debug_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_calls_borg_with_dry_run_parameter():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     flexmock(module).should_receive('execute_command').never()
 
@@ -145,10 +176,14 @@ def test_export_tar_archive_calls_borg_with_dry_run_parameter():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_calls_borg_with_tar_filter_parameters():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--tar-filter', 'bzip2', 'repo::archive', 'test.tar')
@@ -161,11 +196,15 @@ def test_export_tar_archive_calls_borg_with_tar_filter_parameters():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
         tar_filter='bzip2',
     )
 
 
 def test_export_tar_archive_calls_borg_with_list_parameter():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--list', 'repo::archive', 'test.tar'),
@@ -179,11 +218,15 @@ def test_export_tar_archive_calls_borg_with_list_parameter():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
         files=True,
     )
 
 
 def test_export_tar_archive_calls_borg_with_strip_components_parameter():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(
         ('borg', 'export-tar', '--strip-components', '5', 'repo::archive', 'test.tar')
@@ -196,11 +239,15 @@ def test_export_tar_archive_calls_borg_with_strip_components_parameter():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
         strip_components=5,
     )
 
 
 def test_export_tar_archive_skips_abspath_for_remote_repository_parameter():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('server:repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').never()
     insert_execute_command_mock(('borg', 'export-tar', 'server:repo::archive', 'test.tar'))
 
@@ -211,10 +258,14 @@ def test_export_tar_archive_skips_abspath_for_remote_repository_parameter():
         paths=None,
         destination_path='test.tar',
         storage_config={},
+        local_borg_version='1.2.3',
     )
 
 
 def test_export_tar_archive_calls_borg_with_stdout_destination_path():
+    flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
+        ('repo::archive',)
+    )
     flexmock(module.os.path).should_receive('abspath').and_return('repo')
     insert_execute_command_mock(('borg', 'export-tar', 'repo::archive', '-'), capture=False)
 
@@ -225,4 +276,5 @@ def test_export_tar_archive_calls_borg_with_stdout_destination_path():
         paths=None,
         destination_path='-',
         storage_config={},
+        local_borg_version='1.2.3',
     )