##// END OF EJS Templates
Tests for b5605d88dc27 and 840e2b315c1f (interactive prompts during merge)
Tests for b5605d88dc27 and 840e2b315c1f (interactive prompts during merge)

File last commit:

r5469:b12432b1 default
r5672:8a65ea98 default
Show More
extensions.py
85 lines | 2.4 KiB | text/x-python | PythonLexer
Matt Mackall
Create a separate module for managing extensions
r4544 # extensions.py - extension handling for mercurial
#
Thomas Arendsen Hein
Updated copyright notices and add "and others" to "hg version"
r4635 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
Matt Mackall
Create a separate module for managing extensions
r4544 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Brendan Cully
extensions: load modules in module/__init__.py form....
r4569 import imp, os
Matt Mackall
extensions: untangle some recursive dependencies
r4818 import util, sys
Matt Mackall
Create a separate module for managing extensions
r4544 from i18n import _
_extensions = {}
Alexis S. L. Carvalho
Move cmdtable and reposetup handling out of extensions.py...
r5192 _order = []
def extensions():
for name in _order:
module = _extensions[name]
if module:
yield name, module
Matt Mackall
Create a separate module for managing extensions
r4544
def find(name):
'''return module with given extension name'''
try:
return _extensions[name]
except KeyError:
for k, v in _extensions.iteritems():
Matt Mackall
extensions: fix lookup of hgext.foo modules
r4560 if k.endswith('.' + name) or k.endswith('/' + name):
return v
Matt Mackall
Create a separate module for managing extensions
r4544 raise KeyError(name)
def load(ui, name, path):
Bryan O'Sullivan
extensions: don't get confused by aliasing between "foo" and "hgext.foo"
r5031 if name.startswith('hgext.'):
shortname = name[6:]
else:
shortname = name
if shortname in _extensions:
Matt Mackall
Create a separate module for managing extensions
r4544 return
Brendan Cully
Cache extension load failures....
r5087 _extensions[shortname] = None
Matt Mackall
Create a separate module for managing extensions
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
extensions: load modules in module/__init__.py form....
r4569 if os.path.isdir(path):
# module/__init__.py style
Brendan Cully
extensions: fix load of module/__init__.py on OS X
r4580 d, f = os.path.split(path)
fd, fpath, desc = imp.find_module(f, [d])
Brendan Cully
extensions: load modules in module/__init__.py form....
r4569 mod = imp.load_module(module_name, fd, fpath, desc)
else:
mod = imp.load_source(module_name, path)
Matt Mackall
Create a separate module for managing extensions
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
extensions: don't get confused by aliasing between "foo" and "hgext.foo"
r5031 _extensions[shortname] = mod
Alexis S. L. Carvalho
Move cmdtable and reposetup handling out of extensions.py...
r5192 _order.append(shortname)
Matt Mackall
Create a separate module for managing extensions
r4544
uisetup = getattr(mod, 'uisetup', None)
if uisetup:
uisetup(ui)
def loadall(ui):
Matt Mackall
extensions: pull extension-aware bits out of ui
r4617 result = ui.configitems("extensions")
for i, (name, path) in enumerate(result):
if path:
Steve Borho
Allow explicit disabling of extensions...
r5469 if path[0] == '!':
continue
Thomas Arendsen Hein
Cleanup of whitespace, indentation and line continuation.
r4633 path = os.path.expanduser(path)
Matt Mackall
Create a separate module for managing extensions
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