Mercurial > hg
diff mercurial/extensions.py @ 4544:930ed513c864
Create a separate module for managing extensions
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 11 Jun 2007 21:09:23 -0500 |
parents | |
children | 9338be783398 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/extensions.py Mon Jun 11 21:09:23 2007 -0500 @@ -0,0 +1,69 @@ +# extensions.py - extension handling for mercurial +# +# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> +# +# This software may be used and distributed according to the terms +# of the GNU General Public License, incorporated herein by reference. + +import imp, commands, hg, util +from i18n import _ + +_extensions = {} + +def find(name): + '''return module with given extension name''' + try: + return _extensions[name] + except KeyError: + for k, v in _extensions.iteritems(): + if k.endswith('.' + name) or k.endswith('/' + name) or v == name: + return sys.modules[v] + 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('.', '_') + mod = imp.load_source(module_name, path) + 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: + hg.repo_setup_hooks.append(reposetup) + cmdtable = getattr(mod, 'cmdtable', {}) + overrides = [cmd for cmd in cmdtable if cmd in commands.table] + if overrides: + ui.warn(_("extension '%s' overrides commands: %s\n") + % (name, " ".join(overrides))) + commands.table.update(cmdtable) + +def loadall(ui): + for name, path in ui.extensions(): + 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 +