# HG changeset patch # User Augie Fackler # Date 1625672717 14400 # Node ID e972077600e53cbd6bc7f8c76c533f1f5d9bfad1 # Parent 5830539c46beda56390afbb09a5b9bdd63c50698 remotefilelog: stop using RuntimeError for control flow We introduce a new exception to handle the various failure categories, rather than relying on RuntimeError. Differential Revision: https://phab.mercurial-scm.org/D11006 diff -r 5830539c46be -r e972077600e5 hgext/remotefilelog/basestore.py --- a/hgext/remotefilelog/basestore.py Wed Jul 07 13:20:47 2021 -0400 +++ b/hgext/remotefilelog/basestore.py Wed Jul 07 11:45:17 2021 -0400 @@ -308,7 +308,7 @@ # Content matches the intended path return True return False - except (ValueError, RuntimeError): + except (ValueError, shallowutil.BadRemotefilelogHeader): pass return False diff -r 5830539c46be -r e972077600e5 hgext/remotefilelog/shallowutil.py --- a/hgext/remotefilelog/shallowutil.py Wed Jul 07 13:20:47 2021 -0400 +++ b/hgext/remotefilelog/shallowutil.py Wed Jul 07 11:45:17 2021 -0400 @@ -233,6 +233,10 @@ return x +class BadRemotefilelogHeader(error.StorageError): + """Exception raised when parsing a remotefilelog blob header fails.""" + + def parsesizeflags(raw): """given a remotefilelog blob, return (headersize, rawtextsize, flags) @@ -253,16 +257,20 @@ elif s.startswith(constants.METAKEYFLAG): flags = int(s[len(constants.METAKEYFLAG) :]) else: - raise RuntimeError( + raise BadRemotefilelogHeader( b'unsupported remotefilelog header: %s' % header ) else: # v0, str(int(size)) is the header size = int(header) except ValueError: - raise RuntimeError("unexpected remotefilelog header: illegal format") + raise BadRemotefilelogHeader( + "unexpected remotefilelog header: illegal format" + ) if size is None: - raise RuntimeError("unexpected remotefilelog header: no size found") + raise BadRemotefilelogHeader( + "unexpected remotefilelog header: no size found" + ) return index + 1, size, flags diff -r 5830539c46be -r e972077600e5 tests/test-remotefilelog-corrupt-cache.t --- a/tests/test-remotefilelog-corrupt-cache.t Wed Jul 07 13:20:47 2021 -0400 +++ b/tests/test-remotefilelog-corrupt-cache.t Wed Jul 07 11:45:17 2021 -0400 @@ -38,7 +38,8 @@ $ chmod u+w $CACHEDIR/master/11/f6ad8ec52a2984abaafd7c3b516503785c2072/1406e74118627694268417491f018a4a883152f0 $ echo x > $CACHEDIR/master/11/f6ad8ec52a2984abaafd7c3b516503785c2072/1406e74118627694268417491f018a4a883152f0 $ hg up tip 2>&1 | egrep "^[^ ].*unexpected remotefilelog" - RuntimeError: unexpected remotefilelog header: illegal format + abort: unexpected remotefilelog header: illegal format (no-py3 !) + hgext.remotefilelog.shallowutil.BadRemotefilelogHeader: unexpected remotefilelog header: illegal format (py3 !) Verify detection and remediation when remotefilelog.validatecachelog is set