Skip to content
Snippets Groups Projects
Commit 78d05778 authored by Yuya Nishihara's avatar Yuya Nishihara
Browse files

demandimport: fix level passed to loader of sub-modules

As the fromlist gives the names of sub-modules, they should be searched in
the parent directory of the package's __init__.py, which is level=1.

I got the following error by rewriting hgweb to use absolute_import, where
the "mercurial" package is referenced as ".." (level=2):

  ValueError: Attempted relative import beyond toplevel package

I know little about the import mechanism, but this change seems correct.
Before this patch, the following code did import the os module with no error:

  from mercurial import demandimport
  demandimport.enable()
  from mercurial import os
  print os.name
parent ce03e728
No related merge requests found
......@@ -164,7 +164,7 @@
# The name of the module the import statement is located in.
globalname = globals.get('__name__')
def processfromitem(mod, attr, **kwargs):
def processfromitem(mod, attr):
"""Process an imported symbol in the import statement.
If the symbol doesn't exist in the parent module, it must be a
......@@ -172,7 +172,7 @@
"""
symbol = getattr(mod, attr, nothing)
if symbol is nothing:
symbol = _demandmod(attr, mod.__dict__, locals, **kwargs)
symbol = _demandmod(attr, mod.__dict__, locals, level=1)
setattr(mod, attr, symbol)
# Record the importing module references this symbol so we can
......@@ -194,7 +194,7 @@
mod = _hgextimport(_origimport, name, globals, locals, level=level)
for x in fromlist:
processfromitem(mod, x, level=level)
processfromitem(mod, x)
return mod
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment