hooks: only disable/re-enable demandimport when it's already enabled stable
authorBrodie Rao <brodie@sf.io>
Mon, 10 Feb 2014 14:51:06 -0800
branchstable
changeset 20422 aac87f70f38e
parent 20415 e4d7cbc94219
child 20430 d98ba4a87427
child 20490 4e41b2fe46cc
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.
mercurial/demandimport.py
mercurial/hook.py
--- 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:]: