瀏覽代碼

Handle more edge cases by erroring (#418).

Dan Helfman 6 月之前
父節點
當前提交
d4705602fa
共有 1 個文件被更改,包括 15 次插入6 次删除
  1. 15 6
      borgmatic/actions/restore.py

+ 15 - 6
borgmatic/actions/restore.py

@@ -325,7 +325,8 @@ def get_dumps_to_restore(restore_arguments, dumps_from_archive):
     Dump instances from the archive to restore. As part of this, replace any Dump having a data
     source name of "all" with multiple named Dump instances as appropriate.
 
-    Raise ValueError if any of the requested data source names cannot be found in the archive.
+    Raise ValueError if any of the requested data source names cannot be found in the archive or if
+    there are multiple archive dump matches for a given requested dump.
     '''
     requested_dumps = (
         {
@@ -367,12 +368,20 @@ def get_dumps_to_restore(restore_arguments, dumps_from_archive):
         if requested_dump.data_source_name == 'all':
             continue
 
-        for archive_dump in dumps_from_archive:
-            if dumps_match(requested_dump, archive_dump):
-                dumps_to_restore.add(archive_dump)
-                break
-        else:
+        matching_dumps = (
+            archive_dump
+            for archive_dump in dumps_from_archive
+            if dumps_match(requested_dump, archive_dump)
+        )
+
+        if len(matching_dumps) == 0:
             missing_dumps.add(requested_dump)
+        elif len(matching_dumps) == 1:
+            dumps_to_restore.add(archive_dump)
+        else:
+            raise ValueError(
+                f'Cannot restore data source {render_dump_metadata(requested_dump)} because there are multiple matching dumps in the archive. Try adding additional flags to disambiguate.'
+            )
 
     if missing_dumps:
         rendered_dumps = ', '.join(