Patchwork [1,of,6,mergedriver] hook: raise a separate exception for when loading a hook fails

login
register
mail settings
Submitter Siddharth Agarwal
Date Oct. 14, 2015, 11:52 p.m.
Message ID <2a42915e11423eaa1e12.1444866749@dev6666.prn1.facebook.com>
Download mbox | patch
Permalink /patch/11084/
State Accepted
Headers show

Comments

Siddharth Agarwal - Oct. 14, 2015, 11:52 p.m.
# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1444700963 25200
#      Mon Oct 12 18:49:23 2015 -0700
# Node ID 2a42915e11423eaa1e127e12333a890655c8bb76
# Parent  07db7e95c464537aeb2dd7aba39de0813eaffd04
hook: raise a separate exception for when loading a hook fails

For easier catching.
Augie Fackler - Oct. 15, 2015, 1:56 p.m.
On Wed, Oct 14, 2015 at 04:52:29PM -0700, Siddharth Agarwal wrote:
> # HG changeset patch
> # User Siddharth Agarwal <sid0@fb.com>
> # Date 1444700963 25200
> #      Mon Oct 12 18:49:23 2015 -0700
> # Node ID 2a42915e11423eaa1e127e12333a890655c8bb76
> # Parent  07db7e95c464537aeb2dd7aba39de0813eaffd04
> hook: raise a separate exception for when loading a hook fails

This one was obvious enough I took it, but I think someone with more
context (marmoute) should look at the rest of the stack.

>
> For easier catching.
>
> diff --git a/mercurial/error.py b/mercurial/error.py
> --- a/mercurial/error.py
> +++ b/mercurial/error.py
> @@ -57,6 +57,12 @@ class Abort(HintException):
>      """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
>
> diff --git a/mercurial/hook.py b/mercurial/hook.py
> --- a/mercurial/hook.py
> +++ b/mercurial/hook.py
> @@ -35,8 +35,9 @@ def _pythonhook(ui, repo, name, hname, f
>      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 @@ def _pythonhook(ui, repo, name, hname, f
>                          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()
> diff --git a/tests/test-hook.t b/tests/test-hook.t
> --- a/tests/test-hook.t
> +++ b/tests/test-hook.t
> @@ -628,7 +628,7 @@ make sure --traceback works on hook impo
>    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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/error.py b/mercurial/error.py
--- a/mercurial/error.py
+++ b/mercurial/error.py
@@ -57,6 +57,12 @@  class Abort(HintException):
     """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
 
diff --git a/mercurial/hook.py b/mercurial/hook.py
--- a/mercurial/hook.py
+++ b/mercurial/hook.py
@@ -35,8 +35,9 @@  def _pythonhook(ui, repo, name, hname, f
     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 @@  def _pythonhook(ui, repo, name, hname, f
                         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()
diff --git a/tests/test-hook.t b/tests/test-hook.t
--- a/tests/test-hook.t
+++ b/tests/test-hook.t
@@ -628,7 +628,7 @@  make sure --traceback works on hook impo
   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