From b6c20552769962cb5ae7a577cac46e4805c3bc5e Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Sun, 30 Jul 2017 19:35:38 +0200 Subject: [PATCH] Only compare contents when chunker params match (fixes #2899) --- src/borg/archiver.py | 25 +++++++++++++------------ src/borg/testsuite/archiver.py | 14 ++++++++------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 0f2ebd9a8..ebb4b5e1f 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1021,18 +1021,19 @@ class Archiver: def compare_content(path, item1, item2): if contents_changed(item1, item2): if item1.get('deleted'): - return ('added {:>13}'.format(format_file_size(sum_chunk_size(item2)))) - elif item2.get('deleted'): - return ('removed {:>11}'.format(format_file_size(sum_chunk_size(item1)))) - else: - chunk_ids1 = {c.id for c in item1.chunks} - chunk_ids2 = {c.id for c in item2.chunks} - added_ids = chunk_ids2 - chunk_ids1 - removed_ids = chunk_ids1 - chunk_ids2 - added = sum_chunk_size(item2, added_ids) - removed = sum_chunk_size(item1, removed_ids) - return ('{:>9} {:>9}'.format(format_file_size(added, precision=1, sign=True), - format_file_size(-removed, precision=1, sign=True))) + return 'added {:>13}'.format(format_file_size(sum_chunk_size(item2))) + if item2.get('deleted'): + return 'removed {:>11}'.format(format_file_size(sum_chunk_size(item1))) + if not can_compare_chunk_ids: + return 'modified' + chunk_ids1 = {c.id for c in item1.chunks} + chunk_ids2 = {c.id for c in item2.chunks} + added_ids = chunk_ids2 - chunk_ids1 + removed_ids = chunk_ids1 - chunk_ids2 + added = sum_chunk_size(item2, added_ids) + removed = sum_chunk_size(item1, removed_ids) + return '{:>9} {:>9}'.format(format_file_size(added, precision=1, sign=True), + format_file_size(-removed, precision=1, sign=True)) def compare_directory(item1, item2): if item2.get('deleted') and not item1.get('deleted'): diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index 3d2783e1f..0d28eb310 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -3276,9 +3276,10 @@ class DiffArchiverTestCase(ArchiverTestCaseBase): self.cmd('create', self.repository_location + '::test1a', 'input') self.cmd('create', '--chunker-params', '16,18,17,4095', self.repository_location + '::test1b', 'input') - def do_asserts(output, archive): + def do_asserts(output, can_compare_ids): # File contents changed (deleted and replaced with a new file) - assert 'B input/file_replaced' in output + change = 'B' if can_compare_ids else '{:<19}'.format('modified') + assert '{} input/file_replaced'.format(change) in output # File unchanged assert 'input/file_unchanged' not in output @@ -3307,9 +3308,10 @@ class DiffArchiverTestCase(ArchiverTestCaseBase): # The inode has two links and the file contents changed. Borg # should notice the changes in both links. However, the symlink # pointing to the file is not changed. - assert '0 B input/empty' in output + change = '0 B' if can_compare_ids else '{:<19}'.format('modified') + assert '{} input/empty'.format(change) in output if are_hardlinks_supported(): - assert '0 B input/hardlink_contents_changed' in output + assert '{} input/hardlink_contents_changed'.format(change) in output if are_symlinks_supported(): assert 'input/link_target_contents_changed' not in output @@ -3336,9 +3338,9 @@ class DiffArchiverTestCase(ArchiverTestCaseBase): if are_hardlinks_supported(): assert 'input/hardlink_target_replaced' not in output - do_asserts(self.cmd('diff', self.repository_location + '::test0', 'test1a'), '1a') + do_asserts(self.cmd('diff', self.repository_location + '::test0', 'test1a'), True) # We expect exit_code=1 due to the chunker params warning - do_asserts(self.cmd('diff', self.repository_location + '::test0', 'test1b', exit_code=1), '1b') + do_asserts(self.cmd('diff', self.repository_location + '::test0', 'test1b', exit_code=1), False) def test_sort_option(self): self.cmd('init', '--encryption=repokey', self.repository_location)