diff -r 7712fcde2d56 -r fcaf20175b1b mercurial/demandimport.py --- a/mercurial/demandimport.py Sun Jun 19 02:15:09 2016 +0900 +++ b/mercurial/demandimport.py Sun Jun 19 02:17:33 2016 +0900 @@ -188,15 +188,23 @@ if globalname and isinstance(symbol, _demandmod): symbol._addref(globalname) + def chainmodules(rootmod, modname): + # recurse down the module chain, and return the leaf module + mod = rootmod + for comp in modname.split('.')[1:]: + if getattr(mod, comp, nothing) is nothing: + setattr(mod, comp, + _demandmod(comp, mod.__dict__, mod.__dict__)) + mod = getattr(mod, comp) + return mod + if level >= 0: - # The "from a import b,c,d" or "from .a import b,c,d" - # syntax gives errors with some modules for unknown - # reasons. Work around the problem. if name: - return _hgextimport(_origimport, name, globals, locals, - fromlist, level) - - if _pypy: + # "from a import b" or "from .a import b" style + rootmod = _hgextimport(_origimport, name, globals, locals, + level=level) + mod = chainmodules(rootmod, name) + elif _pypy: # PyPy's __import__ throws an exception if invoked # with an empty name and no fromlist. Recreate the # desired behaviour by hand. @@ -220,12 +228,7 @@ # But, we still need to support lazy loading of standard library and 3rd # party modules. So handle level == -1. mod = _hgextimport(_origimport, name, globals, locals) - # recurse down the module chain - for comp in name.split('.')[1:]: - if getattr(mod, comp, nothing) is nothing: - setattr(mod, comp, - _demandmod(comp, mod.__dict__, mod.__dict__)) - mod = getattr(mod, comp) + mod = chainmodules(mod, name) for x in fromlist: processfromitem(mod, x)