mercurial/demandimport.py
changeset 19933 621a26eb3a99
parent 19932 e3a5922e18c3
child 20422 aac87f70f38e
--- a/mercurial/demandimport.py	Sat Oct 05 01:02:22 2013 +0900
+++ b/mercurial/demandimport.py	Sat Oct 05 01:02:22 2013 +0900
@@ -38,6 +38,21 @@
 else:
     _import = _origimport
 
+def _hgextimport(importfunc, name, globals, *args):
+    try:
+        return importfunc(name, globals, *args)
+    except ImportError:
+        if not globals:
+            raise
+        # extensions are loaded with "hgext_" prefix
+        hgextname = 'hgext_%s' % name
+        nameroot = hgextname.split('.', 1)[0]
+        contextroot = globals.get('__name__', '').split('.', 1)[0]
+        if nameroot != contextroot:
+            raise
+        # retry to import with "hgext_" prefix
+        return importfunc(hgextname, globals, *args)
+
 class _demandmod(object):
     """module demand-loader and proxy"""
     def __init__(self, name, globals, locals, level=-1):
@@ -56,7 +71,7 @@
     def _load(self):
         if not self._module:
             head, globals, locals, after, level = self._data
-            mod = _import(head, globals, locals, None, level)
+            mod = _hgextimport(_import, head, globals, locals, None, level)
             # load submodules
             def subload(mod, p):
                 h, t = p, None
@@ -93,7 +108,7 @@
 def _demandimport(name, globals=None, locals=None, fromlist=None, level=-1):
     if not locals or name in ignore or fromlist == ('*',):
         # these cases we can't really delay
-        return _import(name, globals, locals, fromlist, level)
+        return _hgextimport(_import, name, globals, locals, fromlist, level)
     elif not fromlist:
         # import a [as b]
         if '.' in name: # a.b
@@ -112,7 +127,7 @@
             # from . import b,c,d or from .a import b,c,d
             return _origimport(name, globals, locals, fromlist, level)
         # from a import b,c,d
-        mod = _origimport(name, globals, locals)
+        mod = _hgextimport(_origimport, name, globals, locals)
         # recurse down the module chain
         for comp in name.split('.')[1:]:
             if getattr(mod, comp, nothing) is nothing: