Mercurial > hg
changeset 39777:b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
When catching errors in storage, we should be catching
StorageError instead of RevlogError. When throwing errors related
to storage, we shouldn't be using RevlogError unless we know
the error stemmed from revlogs. And we only reliably know that
if we're in revlog.py or are inheriting from a type defined in
revlog.py.
Differential Revision: https://phab.mercurial-scm.org/D4655
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 18 Sep 2018 16:47:09 -0700 |
parents | cb65d4b7e429 |
children | a6b3c4c1019f |
files | hgext/lfs/blobstore.py hgext/lfs/pointer.py hgext/transplant.py mercurial/changelog.py mercurial/error.py mercurial/hgweb/hgweb_mod.py mercurial/manifest.py mercurial/revlogutils/deltas.py mercurial/scmutil.py mercurial/util.py mercurial/verify.py tests/simplestorerepo.py |
diffstat | 12 files changed, 29 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/lfs/blobstore.py Tue Sep 18 16:45:13 2018 -0700 +++ b/hgext/lfs/blobstore.py Tue Sep 18 16:47:09 2018 -0700 @@ -586,7 +586,7 @@ raise error.Abort(_('lfs: unknown url scheme: %s') % scheme) return _storemap[scheme](repo, url) -class LfsRemoteError(error.RevlogError): +class LfsRemoteError(error.StorageError): pass class LfsCorruptionError(error.Abort):
--- a/hgext/lfs/pointer.py Tue Sep 18 16:45:13 2018 -0700 +++ b/hgext/lfs/pointer.py Tue Sep 18 16:47:09 2018 -0700 @@ -19,7 +19,7 @@ stringutil, ) -class InvalidPointer(error.RevlogError): +class InvalidPointer(error.StorageError): pass class gitlfspointer(dict):
--- a/hgext/transplant.py Tue Sep 18 16:45:13 2018 -0700 +++ b/hgext/transplant.py Tue Sep 18 16:47:09 2018 -0700 @@ -503,7 +503,7 @@ def hasnode(repo, node): try: return repo.changelog.rev(node) is not None - except error.RevlogError: + except error.StorageError: return False def browserevs(ui, repo, nodes, opts):
--- a/mercurial/changelog.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/changelog.py Tue Sep 18 16:47:09 2018 -0700 @@ -513,10 +513,10 @@ # revision text contain two "\n\n" sequences -> corrupt # repository since read cannot unpack the revision. if not user: - raise error.RevlogError(_("empty username")) + raise error.StorageError(_("empty username")) if "\n" in user: - raise error.RevlogError(_("username %r contains a newline") - % pycompat.bytestr(user)) + raise error.StorageError(_("username %r contains a newline") + % pycompat.bytestr(user)) desc = stripdesc(desc) @@ -529,8 +529,8 @@ if branch in ("default", ""): del extra["branch"] elif branch in (".", "null", "tip"): - raise error.RevlogError(_('the name \'%s\' is reserved') - % branch) + raise error.StorageError(_('the name \'%s\' is reserved') + % branch) if extra: extra = encodeextra(extra) parseddate = "%s %s" % (parseddate, extra)
--- a/mercurial/error.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/error.py Tue Sep 18 16:47:09 2018 -0700 @@ -283,7 +283,7 @@ Abort.__init__(self, 'failed to update value for "%s/%s"' % (namespace, key)) -class CensoredNodeError(RevlogError): +class CensoredNodeError(StorageError): """error raised when content verification fails on a censored node Also contains the tombstone data substituted for the uncensored data. @@ -291,10 +291,10 @@ def __init__(self, filename, node, tombstone): from .node import short - RevlogError.__init__(self, '%s:%s' % (filename, short(node))) + StorageError.__init__(self, '%s:%s' % (filename, short(node))) self.tombstone = tombstone -class CensoredBaseError(RevlogError): +class CensoredBaseError(StorageError): """error raised when a delta is rejected because its base is censored A delta based on a censored revision must be formed as single patch
--- a/mercurial/hgweb/hgweb_mod.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/hgweb/hgweb_mod.py Tue Sep 18 16:47:09 2018 -0700 @@ -435,7 +435,7 @@ res.status = '404 Not Found' res.headers['Content-Type'] = ctype return rctx.sendtemplate('error', error=msg) - except (error.RepoError, error.RevlogError) as e: + except (error.RepoError, error.StorageError) as e: res.status = '500 Internal Server Error' res.headers['Content-Type'] = ctype return rctx.sendtemplate('error', error=pycompat.bytestr(e))
--- a/mercurial/manifest.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/manifest.py Tue Sep 18 16:47:09 2018 -0700 @@ -643,7 +643,7 @@ """Check filenames for illegal characters.""" for f in l: if '\n' in f or '\r' in f: - raise error.RevlogError( + raise error.StorageError( _("'\\n' and '\\r' disallowed in filenames: %r") % pycompat.bytestr(f))
--- a/mercurial/revlogutils/deltas.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/revlogutils/deltas.py Tue Sep 18 16:47:09 2018 -0700 @@ -457,7 +457,8 @@ if validatehash: revlog.checkhash(fulltext, expectednode, p1=p1, p2=p2) if flags & REVIDX_ISCENSORED: - raise error.RevlogError(_('node %s is not censored') % expectednode) + raise error.StorageError(_('node %s is not censored') % + expectednode) except error.CensoredNodeError: # must pass the censored index flag to add censored revisions if not flags & REVIDX_ISCENSORED:
--- a/mercurial/scmutil.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/scmutil.py Tue Sep 18 16:47:09 2018 -0700 @@ -207,7 +207,7 @@ ui.error("\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg))) except error.CensoredNodeError as inst: ui.error(_("abort: file censored %s!\n") % inst) - except error.RevlogError as inst: + except error.StorageError as inst: ui.error(_("abort: %s!\n") % inst) except error.InterventionRequired as inst: ui.error("%s\n" % inst)
--- a/mercurial/util.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/util.py Tue Sep 18 16:47:09 2018 -0700 @@ -3448,7 +3448,7 @@ The object has a ``decompress(data)`` method that decompresses data. The method will only be called if ``data`` begins with ``revlogheader()``. The method should return the raw, uncompressed - data or raise a ``RevlogError``. + data or raise a ``StorageError``. The object is reusable but is not thread safe. """ @@ -3626,8 +3626,8 @@ try: return zlib.decompress(data) except zlib.error as e: - raise error.RevlogError(_('revlog decompress error: %s') % - stringutil.forcebytestr(e)) + raise error.StorageError(_('revlog decompress error: %s') % + stringutil.forcebytestr(e)) def revlogcompressor(self, opts=None): return self.zlibrevlogcompressor() @@ -3838,8 +3838,8 @@ return ''.join(chunks) except Exception as e: - raise error.RevlogError(_('revlog decompress error: %s') % - stringutil.forcebytestr(e)) + raise error.StorageError(_('revlog decompress error: %s') % + stringutil.forcebytestr(e)) def revlogcompressor(self, opts=None): opts = opts or {}
--- a/mercurial/verify.py Tue Sep 18 16:45:13 2018 -0700 +++ b/mercurial/verify.py Tue Sep 18 16:47:09 2018 -0700 @@ -360,7 +360,7 @@ try: fl = repo.file(f) - except error.RevlogError as e: + except error.StorageError as e: self.err(lr, _("broken revlog! (%s)") % e, f) continue
--- a/tests/simplestorerepo.py Tue Sep 18 16:45:13 2018 -0700 +++ b/tests/simplestorerepo.py Tue Sep 18 16:47:09 2018 -0700 @@ -61,6 +61,9 @@ if not isinstance(rev, int): raise ValueError('expected int') +class simplestoreerror(error.StorageError): + pass + @interfaceutil.implementer(repository.irevisiondelta) @attr.s(slots=True, frozen=True) class simplestorerevisiondelta(object): @@ -261,8 +264,8 @@ return text, True if flags & ~revlog.REVIDX_KNOWN_FLAGS: - raise error.RevlogError(_("incompatible revision flag '%#x'") % - (flags & ~revlog.REVIDX_KNOWN_FLAGS)) + raise simplestoreerror(_("incompatible revision flag '%#x'") % + (flags & ~revlog.REVIDX_KNOWN_FLAGS)) validatehash = True # Depending on the operation (read or write), the order might be @@ -279,7 +282,7 @@ if flag not in revlog._flagprocessors: message = _("missing processor for flag '%#x'") % (flag) - raise error.RevlogError(message) + raise simplestoreerror(message) processor = revlog._flagprocessors[flag] if processor is not None: @@ -299,7 +302,7 @@ if p1 is None and p2 is None: p1, p2 = self.parents(node) if node != revlog.hash(text, p1, p2): - raise error.RevlogError(_("integrity check failed on %s") % + raise simplestoreerror(_("integrity check failed on %s") % self._path) def revision(self, node, raw=False):