extensions.py
89 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
/ mercurial / extensions.py
Matt Mackall
|
r4544 | # extensions.py - extension handling for mercurial | ||
# | ||||
Thomas Arendsen Hein
|
r4635 | # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> | ||
Matt Mackall
|
r4544 | # | ||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
Brendan Cully
|
r4569 | import imp, os | ||
Joel Rosdahl
|
r6212 | import util | ||
Matt Mackall
|
r4544 | from i18n import _ | ||
_extensions = {} | ||||
Alexis S. L. Carvalho
|
r5192 | _order = [] | ||
def extensions(): | ||||
for name in _order: | ||||
module = _extensions[name] | ||||
if module: | ||||
yield name, module | ||||
Matt Mackall
|
r4544 | |||
def find(name): | ||||
'''return module with given extension name''' | ||||
try: | ||||
return _extensions[name] | ||||
except KeyError: | ||||
for k, v in _extensions.iteritems(): | ||||
Matt Mackall
|
r4560 | if k.endswith('.' + name) or k.endswith('/' + name): | ||
return v | ||||
Matt Mackall
|
r4544 | raise KeyError(name) | ||
def load(ui, name, path): | ||||
Benoit Boissinot
|
r7011 | if name.startswith('hgext.') or name.startswith('hgext/'): | ||
Bryan O'Sullivan
|
r5031 | shortname = name[6:] | ||
else: | ||||
shortname = name | ||||
if shortname in _extensions: | ||||
Matt Mackall
|
r4544 | return | ||
Brendan Cully
|
r5087 | _extensions[shortname] = None | ||
Matt Mackall
|
r4544 | if path: | ||
# the module will be loaded in sys.modules | ||||
# choose an unique name so that it doesn't | ||||
# conflicts with other modules | ||||
module_name = "hgext_%s" % name.replace('.', '_') | ||||
Brendan Cully
|
r4569 | if os.path.isdir(path): | ||
# module/__init__.py style | ||||
Brendan Cully
|
r4580 | d, f = os.path.split(path) | ||
fd, fpath, desc = imp.find_module(f, [d]) | ||||
Brendan Cully
|
r4569 | mod = imp.load_module(module_name, fd, fpath, desc) | ||
else: | ||||
mod = imp.load_source(module_name, path) | ||||
Matt Mackall
|
r4544 | else: | ||
def importh(name): | ||||
mod = __import__(name) | ||||
components = name.split('.') | ||||
for comp in components[1:]: | ||||
mod = getattr(mod, comp) | ||||
return mod | ||||
try: | ||||
mod = importh("hgext.%s" % name) | ||||
except ImportError: | ||||
mod = importh(name) | ||||
Bryan O'Sullivan
|
r5031 | _extensions[shortname] = mod | ||
Alexis S. L. Carvalho
|
r5192 | _order.append(shortname) | ||
Matt Mackall
|
r4544 | |||
uisetup = getattr(mod, 'uisetup', None) | ||||
if uisetup: | ||||
uisetup(ui) | ||||
def loadall(ui): | ||||
Matt Mackall
|
r4617 | result = ui.configitems("extensions") | ||
for i, (name, path) in enumerate(result): | ||||
if path: | ||||
Steve Borho
|
r5469 | if path[0] == '!': | ||
continue | ||||
Thomas Arendsen Hein
|
r4633 | path = os.path.expanduser(path) | ||
Matt Mackall
|
r4544 | try: | ||
load(ui, name, path) | ||||
except (util.SignalInterrupt, KeyboardInterrupt): | ||||
raise | ||||
except Exception, inst: | ||||
Jesse Glick
|
r6204 | if path: | ||
ui.warn(_("*** failed to import extension %s from %s: %s\n") | ||||
% (name, path, inst)) | ||||
else: | ||||
ui.warn(_("*** failed to import extension %s: %s\n") | ||||
% (name, inst)) | ||||
Matt Mackall
|
r4544 | if ui.print_exc(): | ||
return 1 | ||||