diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000000000000000000000000000000000000..d3a8b2f3672d8237399f6559497783b84c67f559 --- /dev/null +++ b/CHANGES @@ -0,0 +1,2 @@ +# 0.10.9 + * Better error handling when error.log file are not valid gzip file diff --git a/rdiffweb/librdiff.py b/rdiffweb/librdiff.py index fc4fbeff54cf67c8bbd44caae692f8de7d303dbb..7b7fb032b30f4fe70890155dcab95a02a5e395e2 100755 --- a/rdiffweb/librdiff.py +++ b/rdiffweb/librdiff.py @@ -469,15 +469,24 @@ class HistoryEntry(object): @property def has_errors(self): """Check if the history has errors.""" - return not self._repo._error_logs[self.date].is_empty + try: + return not self._repo._error_logs[self.date].is_empty + except KeyError: + return False @property def errors(self): """Return error messages.""" + # Get error log entry try: - return self._repo._decode(self._repo._error_logs[self.date].read()) + entry = self._repo._error_logs[self.date] except KeyError: return "" + # Read the error log entry. + try: + return self._repo._decode(entry.read()) + except: + return "Error reading log file: " + self._repo._decode(entry.name) @property def increment_size(self): diff --git a/rdiffweb/tests/rdiff-backup-data/error_log.2019-05-22T09:19:09-04:00.data.gz b/rdiffweb/tests/rdiff-backup-data/error_log.2019-05-22T09:19:09-04:00.data.gz new file mode 100644 index 0000000000000000000000000000000000000000..9977a2836c1a0f7fbe7fae516d18d1da4ff4770d --- /dev/null +++ b/rdiffweb/tests/rdiff-backup-data/error_log.2019-05-22T09:19:09-04:00.data.gz @@ -0,0 +1 @@ +invalid diff --git a/rdiffweb/tests/test_librdiff.py b/rdiffweb/tests/test_librdiff.py index 024fe7185176e2fa173725f7930a46cbbb9b4a3e..f92701148ed8ef193eaba54c8431ae796bafcb85 100644 --- a/rdiffweb/tests/test_librdiff.py +++ b/rdiffweb/tests/test_librdiff.py @@ -205,6 +205,12 @@ class HistoryEntryTest(unittest.TestCase): self.assertTrue(entry.has_errors) self.assertEqual('SpecialFileError home/coucou Socket error: AF_UNIX path too long', entry.errors) + def test_errors_invalid_gz(self): + increment = IncrementEntry(self.root_path, b'error_log.2019-05-22T09:19:09-04:00.data.gz') + entry = HistoryEntry(self.repo, increment.date) + self.assertTrue(entry.has_errors) + self.assertEqual('Error reading log file: error_log.2019-05-22T09:19:09-04:00.data.gz', entry.errors) + class RdiffRepoTest(unittest.TestCase):