extensions.py
81 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
/ mercurial / extensions.py
|
r4544 | # extensions.py - extension handling for mercurial | ||
# | ||||
|
r4635 | # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> | ||
|
r4544 | # | ||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
|
r4569 | import imp, os | ||
|
r4818 | import util, sys | ||
|
r4544 | from i18n import _ | ||
_extensions = {} | ||||
|
r4818 | commandtable = {} | ||
setuphooks = [] | ||||
|
r4544 | |||
def find(name): | ||||
'''return module with given extension name''' | ||||
try: | ||||
return _extensions[name] | ||||
except KeyError: | ||||
for k, v in _extensions.iteritems(): | ||||
|
r4560 | if k.endswith('.' + name) or k.endswith('/' + name): | ||
return v | ||||
|
r4544 | raise KeyError(name) | ||
def load(ui, name, path): | ||||
if name in _extensions: | ||||
return | ||||
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('.', '_') | ||||
|
r4569 | if os.path.isdir(path): | ||
# module/__init__.py style | ||||
|
r4580 | d, f = os.path.split(path) | ||
fd, fpath, desc = imp.find_module(f, [d]) | ||||
|
r4569 | mod = imp.load_module(module_name, fd, fpath, desc) | ||
else: | ||||
mod = imp.load_source(module_name, path) | ||||
|
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) | ||||
_extensions[name] = mod | ||||
uisetup = getattr(mod, 'uisetup', None) | ||||
if uisetup: | ||||
uisetup(ui) | ||||
reposetup = getattr(mod, 'reposetup', None) | ||||
if reposetup: | ||||
|
r4818 | setuphooks.append(reposetup) | ||
|
r4544 | cmdtable = getattr(mod, 'cmdtable', {}) | ||
|
r4818 | overrides = [cmd for cmd in cmdtable if cmd in commandtable] | ||
|
r4544 | if overrides: | ||
ui.warn(_("extension '%s' overrides commands: %s\n") | ||||
% (name, " ".join(overrides))) | ||||
|
r4818 | commandtable.update(cmdtable) | ||
|
r4544 | |||
def loadall(ui): | ||||
|
r4617 | result = ui.configitems("extensions") | ||
for i, (name, path) in enumerate(result): | ||||
if path: | ||||
|
r4633 | path = os.path.expanduser(path) | ||
|
r4544 | try: | ||
load(ui, name, path) | ||||
except (util.SignalInterrupt, KeyboardInterrupt): | ||||
raise | ||||
except Exception, inst: | ||||
ui.warn(_("*** failed to import extension %s: %s\n") % | ||||
(name, inst)) | ||||
if ui.print_exc(): | ||||
return 1 | ||||