diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -599,4 +599,15 @@ def _getrevlog(repo, filename): path = 'undolog/' + filename - return revlog.revlog(repo.svfs, path) + try: + return revlog.revlog(repo.svfs, path) + except error.RevlogError: + # corruption: for now, we can simply nuke all files + # TODO: log to Scuba + repo.ui.debug("cought revlog error. %s was probably corrupted", path) + repo.svfs.rmtree('undolog') + repo.svfs.makedirs('undolog') + # if we get the error a second time + # then someone is actively messing with these files + return revlog.revlog(repo.svfs, path) + diff --git a/tests/test-undo.t b/tests/test-undo.t --- a/tests/test-undo.t +++ b/tests/test-undo.t @@ -403,3 +403,11 @@ > tweakdefaults =! > fbamend =! > EOF + +File corruption handling + $ cat >> .hg/store/undolog/index.i << EOF + > corrupted + > EOF + $ hg st + $ hg debugundohistory -l + 0: -- gap in log --