[PATCH stable] hooks: only disable/re-enable demandimport when it's already enabled

Simon Heimberg Simohe at besonet.ch
Mon Feb 10 17:51:55 CST 2014


Am 11.02.2014 00:00, schrieb Brodie Rao:
> # HG changeset patch
> # User Brodie Rao <brodie at sf.io>
> # Date 1392072666 28800
> #      Mon Feb 10 14:51:06 2014 -0800
> # Branch stable
> # Node ID aac87f70f38e1561c98057fc845f333b185b6d5d
> # Parent  e4d7cbc94219e54f5e73df9c2f88eca3d46d7f90
> hooks: only disable/re-enable demandimport when it's already enabled
>
> This fixes an issue introduced in d7c28954d901 where, when disabling
> demandimport while running hooks, it's inadvertently re-enabled even when
> it was never enabled in the first place.
>
> This doesn't affect normal command line usage of Mercurial; it only matters
> when Mercurial is run with demandimport intentionally disabled.
>
> diff --git a/mercurial/demandimport.py b/mercurial/demandimport.py
> --- a/mercurial/demandimport.py
> +++ b/mercurial/demandimport.py
> @@ -162,6 +162,9 @@ ignore = [
>       'mimetools',
>       ]
>
> +def isenabled():
> +    return __builtin__.__import__ == _demandimport
> +
>   def enable():
>       "enable global demand-loading of modules"
>       __builtin__.__import__ = _demandimport
> diff --git a/mercurial/hook.py b/mercurial/hook.py
> --- a/mercurial/hook.py
> +++ b/mercurial/hook.py
> @@ -36,28 +36,33 @@ def _pythonhook(ui, repo, name, hname, f
>               if modpath and modfile:
>                   sys.path = sys.path[:] + [modpath]
>                   modname = modfile
> +        demandimportenabled = demandimport.isenabled()
> +        if demandimportenabled:
> +            demandimport.disable()
>           try:
> -            demandimport.disable()
> -            obj = __import__(modname)

Why did we disable demandimport here? __import__ is never delayed. (See 
comment at start of mercurial/demandimport.py) Let's only remove disable 
and enable.

> -            demandimport.enable()
> -        except ImportError:
> -            e1 = sys.exc_type, sys.exc_value, sys.exc_traceback
>               try:
> -                # extensions are loaded with hgext_ prefix
> -                obj = __import__("hgext_%s" % modname)
> +                obj = __import__(modname)
> +            except ImportError:
> +                e1 = sys.exc_type, sys.exc_value, sys.exc_traceback
> +                try:
> +                    # extensions are loaded with hgext_ prefix
> +                    obj = __import__("hgext_%s" % modname)
> +                except ImportError:
> +                    e2 = sys.exc_type, sys.exc_value, sys.exc_traceback
> +                    if ui.tracebackflag:
> +                        ui.warn(_('exception from first failed import '
> +                                  'attempt:\n'))
> +                    ui.traceback(e1)
> +                    if ui.tracebackflag:
> +                        ui.warn(_('exception from second failed import '
> +                                  'attempt:\n'))
> +                    ui.traceback(e2)
> +                    raise util.Abort(_('%s hook is invalid '
> +                                       '(import of "%s" failed)') %
> +                                     (hname, modname))
> +        finally:
> +            if demandimportenabled:
>                   demandimport.enable()
> -            except ImportError:
> -                demandimport.enable()
> -                e2 = sys.exc_type, sys.exc_value, sys.exc_traceback
> -                if ui.tracebackflag:
> -                    ui.warn(_('exception from first failed import attempt:\n'))
> -                ui.traceback(e1)
> -                if ui.tracebackflag:
> -                    ui.warn(_('exception from second failed import attempt:\n'))
> -                ui.traceback(e2)
> -                raise util.Abort(_('%s hook is invalid '
> -                                   '(import of "%s" failed)') %
> -                                 (hname, modname))
>           sys.path = oldpaths
>           try:
>               for p in funcname.split('.')[1:]:
>



More information about the Mercurial-devel mailing list