diff --git a/hgext3rd/undo.py b/hgext3rd/undo.py --- a/hgext3rd/undo.py +++ b/hgext3rd/undo.py @@ -184,19 +184,19 @@ rlog = _getrevlog(repo, 'index.i') hexnode = hex(rlog.node(_invertindex(rlog, reverseindex))) #return writelog(repo, tr, "redo.i", "node " + str(hexnode)) - return repo.svfs.write("undolog/redo.i", str(hexnode)) + return repo.vfs.write("undolog/redo.i", str(hexnode)) def _delundoredo(repo): path = 'undolog' + '/' + 'redo.i' - repo.svfs.tryunlink(path) + repo.vfs.tryunlink(path) def _recordnewgap(repo, absoluteindex=None): path = 'undolog' + '/' + 'gap' if absoluteindex is None: rlog = _getrevlog(repo, 'index.i') - repo.svfs.write(path, str(len(rlog) - 1)) + repo.vfs.write(path, str(len(rlog) - 1)) else: - repo.svfs.write(path, str(absoluteindex)) + repo.vfs.write(path, str(absoluteindex)) # Read @@ -225,7 +225,7 @@ absoluteindex = _invertindex(rlog, reverseindex) path = 'undolog' + '/' + 'gap' try: - result = absoluteindex >= int(repo.svfs.read(path)) + result = absoluteindex >= int(repo.vfs.read(path)) except IOError: # recreate file repo.ui.debug("failed to read gap file in %s, attempting recreation\n" @@ -527,7 +527,7 @@ # allows for relative undos using # redo.i storage try: - hexnode = repo.svfs.read("undolog/redo.i") + hexnode = repo.vfs.read("undolog/redo.i") rlog = _getrevlog(repo, 'index.i') rev = rlog.rev(bin(hexnode)) reverseindex = _invertindex(rlog, rev) + reverseindex @@ -595,4 +595,14 @@ def _getrevlog(repo, filename): path = 'undolog/' + filename - return revlog.revlog(repo.vfs, path) + try: + return revlog.revlog(repo.vfs, 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.vfs.rmtree('undolog') + repo.vfs.makedirs('undolog') + # if we get the error a second time + # then someone is actively messing with these files + return revlog.revlog(repo.vfs, 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/undolog/index.i << EOF + > corrupted + > EOF + $ hg st + $ hg debugundohistory -l + 0: -- gap in log --