diff --git a/NEWS b/NEWS index 4b26ba95..994c97b4 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ 2.0.14.dev0 * #1208: Fix for the database "restore" action restoring more databases than the "--database" flag specifies. + * #1212: Fix an error when restoring multiple directory-format database dumps at once. 2.0.13 * #1054: Allow the Btrfs hook to create and delete snapshots even when running diff --git a/borgmatic/actions/restore.py b/borgmatic/actions/restore.py index 8d0e3c7c..92d4612a 100644 --- a/borgmatic/actions/restore.py +++ b/borgmatic/actions/restore.py @@ -129,14 +129,14 @@ def get_configured_data_source(config, restore_dump): def strip_path_prefix_from_extracted_dump_destination( - destination_path, + extract_path, borgmatic_runtime_directory, ): ''' Directory-format dump files get extracted into a temporary directory containing a path prefix - that depends how the files were stored in the archive. So, given the destination path where the - dump was extracted and the borgmatic runtime directory, move the dump files such that the - restore doesn't have to deal with that varying path prefix. + that depends how the files were stored in the archive. So, given the path where the dump was + extracted and the borgmatic runtime directory, move the dump files such that the restore doesn't + have to deal with that varying path prefix. For instance, if the dump was extracted to: @@ -150,16 +150,16 @@ def strip_path_prefix_from_extracted_dump_destination( /run/user/0/borgmatic/postgresql_databases/test/... ''' - for subdirectory_path, _, _ in os.walk(destination_path): + for subdirectory_path, _, _ in os.walk(extract_path): databases_directory = os.path.basename(subdirectory_path) if not databases_directory.endswith('_databases'): continue - shutil.move( - subdirectory_path, - os.path.join(borgmatic_runtime_directory, databases_directory), - ) + destination_path = os.path.join(borgmatic_runtime_directory, databases_directory) + shutil.rmtree(destination_path, ignore_errors=True) + shutil.move(subdirectory_path, destination_path) + break diff --git a/tests/unit/actions/test_restore.py b/tests/unit/actions/test_restore.py index 00fc474d..d15e9b87 100644 --- a/tests/unit/actions/test_restore.py +++ b/tests/unit/actions/test_restore.py @@ -295,6 +295,7 @@ def test_strip_path_prefix_from_extracted_dump_destination_renames_first_matchin ], ) + flexmock(module.shutil).should_receive('rmtree') flexmock(module.shutil).should_receive('move').with_args( '/foo/bar/postgresql_databases', '/run/user/0/borgmatic/postgresql_databases',