repoview: fix corrupted hiddencache crash Mercurial (
issue5042)
Before this patch if the hiddencache existed but was empty, it would crash
mercurial. This patch adds exception handling when reading the hiddencache to
avoid the issue.
When encountering a corrupted cache file we print a devel warning. There would
be no point in issuing a normal warning as the user wouldn't be able to do
anything about the situation.
The warning looks like:
devel-warn: corrupted hidden cache, removing it at: /path/to/repoview.py
--- a/mercurial/repoview.py Wed Jan 20 13:40:59 2016 -0800
+++ b/mercurial/repoview.py Wed Jan 20 13:43:01 2016 -0800
@@ -150,6 +150,13 @@
count = len(data) / 4
hidden = frozenset(struct.unpack('>%ii' % count, data))
return hidden
+ except struct.error:
+ repo.ui.debug('corrupted hidden cache\n')
+ # No need to fix the content as it will get rewritten
+ return None
+ except (IOError, OSError):
+ repo.ui.debug('cannot read hidden cache\n')
+ return None
finally:
if fh:
fh.close()
--- a/tests/test-obsolete.t Wed Jan 20 13:40:59 2016 -0800
+++ b/tests/test-obsolete.t Wed Jan 20 13:43:01 2016 -0800
@@ -951,6 +951,23 @@
$ hg amendtransient
[1, 3]
+Check that corrupted hidden cache does not crash
+
+ $ printf "" > .hg/cache/hidden
+ $ hg log -r . -T '{node}' --debug
+ corrupted hidden cache
+ 8fd96dfc63e51ed5a8af1bec18eb4b19dbf83812 (no-eol)
+ $ hg log -r . -T '{node}' --debug
+ 8fd96dfc63e51ed5a8af1bec18eb4b19dbf83812 (no-eol)
+
+Check that wrong hidden cache permission does not crash
+
+ $ chmod 000 .hg/cache/hidden
+ $ hg log -r . -T '{node}' --debug
+ cannot read hidden cache
+ error writing hidden changesets cache
+ 8fd96dfc63e51ed5a8af1bec18eb4b19dbf83812 (no-eol)
+
Test cache consistency for the visible filter
1) We want to make sure that the cached filtered revs are invalidated when
bookmarks change