diff -r e3a5922e18c3 -r 621a26eb3a99 mercurial/demandimport.py --- 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: