diff --git a/borgmatic/actions/restore.py b/borgmatic/actions/restore.py index 83f22068..0b012a2b 100644 --- a/borgmatic/actions/restore.py +++ b/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(