extensions.py
119 lines
| 3.4 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 | ||
Matt Mackall
|
r7215 | import util, cmdutil | ||
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) | ||
Alexander Solovyov
|
r7916 | def loadpath(path, module_name): | ||
module_name = module_name.replace('.', '_') | ||||
path = os.path.expanduser(path) | ||||
if os.path.isdir(path): | ||||
# module/__init__.py style | ||||
Alexander Solovyov
|
r7960 | d, f = os.path.split(path.rstrip('/')) | ||
Alexander Solovyov
|
r7916 | fd, fpath, desc = imp.find_module(f, [d]) | ||
return imp.load_module(module_name, fd, fpath, desc) | ||||
else: | ||||
return imp.load_source(module_name, path) | ||||
Matt Mackall
|
r4544 | 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 | ||||
Alexander Solovyov
|
r7916 | mod = loadpath(path, 'hgext.%s' % name) | ||
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") | ||
Peter Arrenbrecht
|
r7876 | for (name, path) in result: | ||
Matt Mackall
|
r4617 | if path: | ||
Steve Borho
|
r5469 | if path[0] == '!': | ||
continue | ||||
Matt Mackall
|
r4544 | try: | ||
load(ui, name, path) | ||||
Matt Mackall
|
r7644 | except KeyboardInterrupt: | ||
Matt Mackall
|
r4544 | 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 | ||||
Matt Mackall
|
r7215 | def wrapcommand(table, command, wrapper): | ||
aliases, entry = cmdutil.findcmd(command, table) | ||||
for alias, e in table.iteritems(): | ||||
if e is entry: | ||||
key = alias | ||||
break | ||||
origfn = entry[0] | ||||
def wrap(*args, **kwargs): | ||||
Matt Mackall
|
r7388 | return util.checksignature(wrapper)( | ||
util.checksignature(origfn), *args, **kwargs) | ||||
Matt Mackall
|
r7215 | |||
wrap.__doc__ = getattr(origfn, '__doc__') | ||||
Dirkjan Ochtman
|
r7373 | wrap.__module__ = getattr(origfn, '__module__') | ||
Matt Mackall
|
r7215 | |||
newentry = list(entry) | ||||
newentry[0] = wrap | ||||
table[key] = tuple(newentry) | ||||
return entry | ||||
def wrapfunction(container, funcname, wrapper): | ||||
def wrap(*args, **kwargs): | ||||
return wrapper(origfn, *args, **kwargs) | ||||
origfn = getattr(container, funcname) | ||||
setattr(container, funcname, wrap) | ||||
return origfn | ||||