changeset 26692:8d1cfd77b64f

hook: raise a separate exception for when loading a hook fails For easier catching.
author Siddharth Agarwal <sid0@fb.com>
date Mon, 12 Oct 2015 18:49:23 -0700
parents 23c0da28c034
children 338af85109dd
files mercurial/error.py mercurial/hook.py tests/test-hook.t
diffstat 3 files changed, 19 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/error.py	Wed Oct 14 11:05:53 2015 -0700
+++ b/mercurial/error.py	Mon Oct 12 18:49:23 2015 -0700
@@ -57,6 +57,12 @@
     """Raised if a command needs to print an error and exit."""
     pass
 
+class HookLoadError(Abort):
+    """raised when loading a hook fails, aborting an operation
+
+    Exists to allow more specialized catching."""
+    pass
+
 class HookAbort(Abort):
     """raised when a validation hook fails, aborting an operation
 
--- a/mercurial/hook.py	Wed Oct 14 11:05:53 2015 -0700
+++ b/mercurial/hook.py	Mon Oct 12 18:49:23 2015 -0700
@@ -35,8 +35,9 @@
     else:
         d = funcname.rfind('.')
         if d == -1:
-            raise error.Abort(_('%s hook is invalid ("%s" not in '
-                               'a module)') % (hname, funcname))
+            raise error.HookLoadError(
+                _('%s hook is invalid ("%s" not in a module)')
+                % (hname, funcname))
         modname = funcname[:d]
         oldpaths = sys.path
         if util.mainfrozen():
@@ -63,21 +64,21 @@
                         ui.warn(_('exception from second failed import '
                                   'attempt:\n'))
                     ui.traceback(e2)
-                    raise error.Abort(_('%s hook is invalid '
-                                       '(import of "%s" failed)') %
-                                     (hname, modname))
+                    raise error.HookLoadError(
+                        _('%s hook is invalid (import of "%s" failed)') %
+                        (hname, modname))
         sys.path = oldpaths
         try:
             for p in funcname.split('.')[1:]:
                 obj = getattr(obj, p)
         except AttributeError:
-            raise error.Abort(_('%s hook is invalid '
-                               '("%s" is not defined)') %
-                             (hname, funcname))
+            raise error.HookLoadError(
+                _('%s hook is invalid ("%s" is not defined)')
+                % (hname, funcname))
         if not callable(obj):
-            raise error.Abort(_('%s hook is invalid '
-                               '("%s" is not callable)') %
-                             (hname, funcname))
+            raise error.HookLoadError(
+                _('%s hook is invalid ("%s" is not callable)')
+                % (hname, funcname))
 
     ui.note(_("calling hook %s: %s\n") % (hname, funcname))
     starttime = time.time()
--- a/tests/test-hook.t	Wed Oct 14 11:05:53 2015 -0700
+++ b/tests/test-hook.t	Mon Oct 12 18:49:23 2015 -0700
@@ -628,7 +628,7 @@
   Traceback (most recent call last):
   ImportError: No module named hgext_importfail
   Traceback (most recent call last):
-  Abort: precommit.importfail hook is invalid (import of "importfail" failed)
+  HookLoadError: precommit.importfail hook is invalid (import of "importfail" failed)
   abort: precommit.importfail hook is invalid (import of "importfail" failed)
 
 Issue1827: Hooks Update & Commit not completely post operation