[PATCH RFC STABLE] introduce new RequirementError (issue2649)

Adrian Buehlmann adrian at cadifra.com
Fri Feb 18 14:58:31 CST 2011


# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1298057125 -3600
# Branch stable
# Node ID eee8ff74d9d09f0da56db07c0799397839772ef1
# Parent  d724a69309e0ce9a7d8efb13e11ba45a4c85045c
introduce new RequirementError (issue2649)

We do not inherit from RepoError to make sure this error is not caught by
"except error.RepoError" blocks like in dispatch.py line 581, so we can
avoid obscuring the original error message, which explicitly mentions the
unknown requirement ("requirement ... not supported").

RequirementError is a non-recoverable error.

diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -94,6 +94,8 @@ def _runcatch(ui, args):
         else:
             ui.warn(_("hg: %s\n") % inst.args[1])
             commands.help_(ui, 'shortlist')
+    except error.RequirementError, inst:
+        ui.warn(_("abort: %s!\n") % inst)
     except error.RepoError, inst:
         ui.warn(_("abort: %s!\n") % inst)
     except error.ResponseError, inst:
diff --git a/mercurial/error.py b/mercurial/error.py
--- a/mercurial/error.py
+++ b/mercurial/error.py
@@ -51,6 +51,11 @@ class RepoLookupError(RepoError):
 class CapabilityError(RepoError):
     pass
 
+class RequirementError(Exception):
+    """Exception raised if .hg/requires has an unknown entry.
+    Intentionally not inherited from RepoError"""
+    pass
+
 class LockError(IOError):
     def __init__(self, errno, strerror, filename, desc):
         IOError.__init__(self, errno, strerror, filename)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -75,7 +75,8 @@ class localrepository(repo.repository):
                 if inst.errno != errno.ENOENT:
                     raise
             for r in requirements - self.supported:
-                raise error.RepoError(_("requirement '%s' not supported") % r)
+                raise error.RequirementError(
+                          _("requirement '%s' not supported") % r)
 
         self.sharedpath = self.path
         try:
diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -112,7 +112,8 @@ class statichttprepository(localrepo.loc
         # check them
         for r in requirements:
             if r not in self.supported:
-                raise error.RepoError(_("requirement '%s' not supported") % r)
+                raise error.RequirementError(
+                        _("requirement '%s' not supported") % r)
 
         # setup store
         self.store = store.store(requirements, self.path, opener)
diff --git a/tests/test-commit.t b/tests/test-commit.t
--- a/tests/test-commit.t
+++ b/tests/test-commit.t
@@ -92,6 +92,15 @@ An empty date was interpreted as epoch o
   $ hg commit -d '' -m commit-no-date
   $ hg tip --template '{date|isodate}\n' | grep '1970'
   [1]
+
+Make sure we do not obscure unknown requires file entries (issue2649)
+
+  $ echo foo >> foo
+  $ echo fake >> .hg/requires
+  $ hg commit -m bla
+  abort: requirement 'fake' not supported!
+  [255]
+
   $ cd ..
 
 
diff --git a/tests/test-identify.t b/tests/test-identify.t
--- a/tests/test-identify.t
+++ b/tests/test-identify.t
@@ -67,3 +67,11 @@ remote with tags?
   $ hg id -t http://localhost:$HGPORT1/
   abort: can't query remote revision number, branch, or tags
   [255]
+
+Make sure we do not obscure unknown requires file entries (issue2649)
+
+  $ echo fake >> .hg/requires
+  $ hg id
+  abort: requirement 'fake' not supported!
+  [255]
+


More information about the Mercurial-devel mailing list