diff -r c07974215b3d -r de1e7099d100 mercurial/extensions.py --- a/mercurial/extensions.py Sun Feb 07 11:32:08 2010 +0100 +++ b/mercurial/extensions.py Sun Feb 07 14:01:43 2010 +0100 @@ -6,7 +6,7 @@ # GNU General Public License version 2 or any later version. import imp, os -import util, cmdutil, help +import util, cmdutil, help, error from i18n import _, gettext _extensions = {} @@ -131,8 +131,9 @@ setattr(container, funcname, wrap) return origfn -def _disabledpaths(): - '''find paths of disabled extensions. returns a dict of {name: path}''' +def _disabledpaths(strip_init=False): + '''find paths of disabled extensions. returns a dict of {name: path} + removes /__init__.py from packages if strip_init is True''' import hgext extpath = os.path.dirname(os.path.abspath(hgext.__file__)) try: # might not be a filesystem path @@ -150,6 +151,8 @@ path = os.path.join(extpath, e, '__init__.py') if not os.path.exists(path): continue + if strip_init: + path = os.path.dirname(path) if name in exts or name in _order or name == '__init__': continue exts[name] = path @@ -191,6 +194,53 @@ return exts, maxlength +def disabledext(name): + '''find a specific disabled extension from hgext. returns desc''' + paths = _disabledpaths() + if name in paths: + return _disabledhelp(paths[name]) + +def disabledcmd(cmd, strict=False): + '''import disabled extensions until cmd is found. + returns (cmdname, extname, doc)''' + + paths = _disabledpaths(strip_init=True) + if not paths: + raise error.UnknownCommand(cmd) + + def findcmd(cmd, name, path): + try: + mod = loadpath(path, 'hgext.%s' % name) + except Exception: + return + try: + aliases, entry = cmdutil.findcmd(cmd, + getattr(mod, 'cmdtable', {}), strict) + except (error.AmbiguousCommand, error.UnknownCommand): + return + for c in aliases: + if c.startswith(cmd): + cmd = c + break + else: + cmd = aliases[0] + return (cmd, name, mod) + + # first, search for an extension with the same name as the command + path = paths.pop(cmd, None) + if path: + ext = findcmd(cmd, cmd, path) + if ext: + return ext + + # otherwise, interrogate each extension until there's a match + for name, path in paths.iteritems(): + ext = findcmd(cmd, name, path) + if ext: + return ext + + raise error.UnknownCommand(cmd) + def enabled(): '''return a dict of {name: desc} of extensions, and the max name length''' exts = {}