global: replace most uses of RevlogError with StorageError (API)
authorGregory Szorc <gregory.szorc@gmail.com>
Tue, 18 Sep 2018 16:47:09 -0700
changeset 39777 b63dee7bd0d9
parent 39776 cb65d4b7e429
child 39778 a6b3c4c1019f
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
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
--- 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):