--- 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: