@@ -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):
@@ -55,7 +70,7 @@
def _load(self):
if not self._module:
head, globals, locals, after = self._data
- mod = _origimport(head, globals, locals)
+ mod = _hgextimport(_origimport, head, globals, locals)
# load submodules
def subload(mod, p):
h, t = p, None
@@ -92,7 +107,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
@@ -111,7 +126,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:
@@ -129,6 +129,73 @@
$ echo 'foo = !' >> $HGRCPATH
$ echo 'bar = !' >> $HGRCPATH
+Check absolute/relative import of extension specific modules
+
+ $ mkdir $TESTTMP/extroot
+ $ cat > $TESTTMP/extroot/__init__.py <<EOF
+ > extrootstr = 'this is extroot.extrootstr'
+ > import foo
+ > def extsetup(ui):
+ > ui.write('(extroot) ', foo.func(), '\n')
+ > EOF
+ $ cat > $TESTTMP/extroot/foo.py <<EOF
+ > buf = []
+ > def func():
+ > # "not locals" case
+ > import bar # relative
+ > buf.append('import bar in func(): %s' % bar.barstr)
+ > import extroot.bar # absolute
+ > buf.append('import extroot.bar in func(): %s' % extroot.bar.barstr)
+ >
+ > return '\n(extroot) '.join(buf)
+ >
+ > # "fromlist == ('*',)" case
+ > from bar import * # relative
+ > buf.append('from bar import *: %s' % barstr)
+ > from extroot.bar import * # absolute
+ > buf.append('from extroot.bar import *: %s' % barstr)
+ >
+ > # "not fromlist" and "if '.' in name" case
+ > import sub1.baz # relative
+ > buf.append('import sub1.baz: %s' % sub1.baz.bazstr)
+ > import extroot.sub1.baz # absolute
+ > buf.append('import extroot.sub1.baz: %s' % extroot.sub1.baz.bazstr)
+ >
+ > # "not fromlist" and NOT "if '.' in name" case
+ > import sub1 # relative
+ > buf.append('import sub1: %s' % sub1.sub1str)
+ > import extroot # absolute
+ > buf.append('import extroot: %s' % extroot.extrootstr)
+ >
+ > # NOT "not fromlist" and NOT "level != -1" case
+ > from bar import barstr # relative
+ > buf.append('from bar import barstr: %s' % barstr)
+ > from extroot.bar import barstr # absolute
+ > buf.append('from extroot.bar import barstr: %s' % barstr)
+ > EOF
+ $ cat > $TESTTMP/extroot/bar.py <<EOF
+ > barstr = 'this is extroot.bar.barstr'
+ > EOF
+ $ mkdir $TESTTMP/extroot/sub1
+ $ cat > $TESTTMP/extroot/sub1/__init__.py <<EOF
+ > sub1str = 'this is extroot.sub1.sub1str'
+ > EOF
+ $ cat > $TESTTMP/extroot/sub1/baz.py <<EOF
+ > bazstr = 'this is extroot.sub1.baz.bazstr'
+ > EOF
+ $ hg --config extensions.extroot=$TESTTMP/extroot tip --template '{rev}\n'
+ (extroot) from bar import *: this is extroot.bar.barstr
+ (extroot) from extroot.bar import *: this is extroot.bar.barstr
+ (extroot) import sub1.baz: this is extroot.sub1.baz.bazstr
+ (extroot) import extroot.sub1.baz: this is extroot.sub1.baz.bazstr
+ (extroot) import sub1: this is extroot.sub1.sub1str
+ (extroot) import extroot: this is extroot.extrootstr
+ (extroot) from bar import barstr: this is extroot.bar.barstr
+ (extroot) from extroot.bar import barstr: this is extroot.bar.barstr
+ (extroot) import bar in func(): this is extroot.bar.barstr
+ (extroot) import extroot.bar in func(): this is extroot.bar.barstr
+ 0
+
$ cd ..
hide outer repo