diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 7a5cedb20..1435dd827 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1030,6 +1030,10 @@ def compare_link(item1, item2): return 'changed link' def contents_changed(item1, item2): + if item1.get('deleted') != item2.get('deleted'): + # a deleleted/non-existing file is considered different to an existing file, + # even if the latter is empty. + return True if can_compare_chunk_ids: return item1.chunks != item2.chunks else: diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index 52f38c357..54a63acd4 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -3410,6 +3410,7 @@ def test_basic_functionality(self): # Setup files for the second snapshot self.create_regular_file('file_added', size=2048) + self.create_regular_file('file_empty_added', size=0) os.unlink('input/file_removed') os.unlink('input/file_removed2') os.unlink('input/file_replaced') @@ -3484,6 +3485,9 @@ def do_asserts(output, can_compare_ids): if are_hardlinks_supported(): assert 'added 2.05 kB input/hardlink_added' in output + # check if a diff between non-existent and empty new file is found + assert 'added 0 B input/file_empty_added' in output + # The inode has two links and both of them are deleted. They should # appear as two deleted files. assert 'removed 256 B input/file_removed' in output