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.
--- a/mercurial/demandimport.py Mon Feb 10 00:43:54 2014 +0100
+++ b/mercurial/demandimport.py Mon Feb 10 14:51:06 2014 -0800
@@ -162,6 +162,9 @@
'mimetools',
]
+def isenabled():
+ return __builtin__.__import__ == _demandimport
+
def enable():
"enable global demand-loading of modules"
__builtin__.__import__ = _demandimport
--- a/mercurial/hook.py Mon Feb 10 00:43:54 2014 +0100
+++ b/mercurial/hook.py Mon Feb 10 14:51:06 2014 -0800
@@ -36,28 +36,33 @@
if modpath and modfile:
sys.path = sys.path[:] + [modpath]
modname = modfile
- try:
+ demandimportenabled = demandimport.isenabled()
+ if demandimportenabled:
demandimport.disable()
- obj = __import__(modname)
- demandimport.enable()
- except ImportError:
- e1 = sys.exc_type, sys.exc_value, sys.exc_traceback
+ try:
try:
- # extensions are loaded with hgext_ prefix
- obj = __import__("hgext_%s" % modname)
- demandimport.enable()
+ 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()
- 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:]: