78 components = name.split('.') |
78 components = name.split('.') |
79 for comp in components[1:]: |
79 for comp in components[1:]: |
80 mod = getattr(mod, comp) |
80 mod = getattr(mod, comp) |
81 return mod |
81 return mod |
82 |
82 |
|
83 def _importext(name, path=None, reportfunc=None): |
|
84 if path: |
|
85 # the module will be loaded in sys.modules |
|
86 # choose an unique name so that it doesn't |
|
87 # conflicts with other modules |
|
88 mod = loadpath(path, 'hgext.%s' % name) |
|
89 else: |
|
90 try: |
|
91 mod = _importh("hgext.%s" % name) |
|
92 except ImportError as err: |
|
93 if reportfunc: |
|
94 reportfunc(err, "hgext.%s" % name, "hgext3rd.%s" % name) |
|
95 try: |
|
96 mod = _importh("hgext3rd.%s" % name) |
|
97 except ImportError as err: |
|
98 if reportfunc: |
|
99 reportfunc(err, "hgext3rd.%s" % name, name) |
|
100 mod = _importh(name) |
|
101 return mod |
|
102 |
83 def _reportimporterror(ui, err, failed, next): |
103 def _reportimporterror(ui, err, failed, next): |
84 # note: this ui.debug happens before --debug is processed, |
104 # note: this ui.debug happens before --debug is processed, |
85 # Use --config ui.debug=1 to see them. |
105 # Use --config ui.debug=1 to see them. |
86 ui.debug('could not import %s (%s): trying %s\n' |
106 ui.debug('could not import %s (%s): trying %s\n' |
87 % (failed, err, next)) |
107 % (failed, err, next)) |
96 if shortname in _builtin: |
116 if shortname in _builtin: |
97 return None |
117 return None |
98 if shortname in _extensions: |
118 if shortname in _extensions: |
99 return _extensions[shortname] |
119 return _extensions[shortname] |
100 _extensions[shortname] = None |
120 _extensions[shortname] = None |
101 if path: |
121 mod = _importext(name, path, bind(_reportimporterror, ui)) |
102 # the module will be loaded in sys.modules |
|
103 # choose an unique name so that it doesn't |
|
104 # conflicts with other modules |
|
105 mod = loadpath(path, 'hgext.%s' % name) |
|
106 else: |
|
107 try: |
|
108 mod = _importh("hgext.%s" % name) |
|
109 except ImportError as err: |
|
110 _reportimporterror(ui, err, "hgext.%s" % name, "hgext3rd.%s" % name) |
|
111 try: |
|
112 mod = _importh("hgext3rd.%s" % name) |
|
113 except ImportError as err: |
|
114 _reportimporterror(ui, err, "hgext3rd.%s" % name, name) |
|
115 mod = _importh(name) |
|
116 |
122 |
117 # Before we do anything with the extension, check against minimum stated |
123 # Before we do anything with the extension, check against minimum stated |
118 # compatibility. This gives extension authors a mechanism to have their |
124 # compatibility. This gives extension authors a mechanism to have their |
119 # extensions short circuit when loaded with a known incompatible version |
125 # extensions short circuit when loaded with a known incompatible version |
120 # of Mercurial. |
126 # of Mercurial. |