[PATCH 1 of 1] extensions: load all extensions first, call setup functions thereafter

TK Soh teekaysoh at gmail.com
Thu Aug 13 00:41:44 CDT 2009


On Wed, Aug 12, 2009 at 11:54 AM, Simon Heimberg<simohe at besonet.ch> wrote:
> # HG changeset patch
> # User Simon Heimberg <simohe at besonet.ch>
> # Date 1250075746 -7200
> # Node ID 3bc8dde7c38d6985d8f111165107402002983fe4
> # Parent  527eddab742d5db6df5f5ac8d3c46de98004f9b3
> extensions: load all extensions first, call setup functions thereafter
>
> new order for extension calls:
> - load all extensions
> - uisetup(ui) for all extensions
> - extsetup() for all extensions

Is this is right time pass ui to extsetup()?

> - add commands to commandtable for all extensions
> - reposetup(ui, repo) for all extensions
>
> diff -r 527eddab742d -r 3bc8dde7c38d mercurial/dispatch.py
> --- a/mercurial/dispatch.py     Mit Jul 29 14:21:18 2009 +0200
> +++ b/mercurial/dispatch.py     Mit Aug 12 13:15:46 2009 +0200
> @@ -320,7 +320,6 @@
>               result = ret)
>     return ret
>
> -_loaded = set()
>  def _dispatch(ui, args):
>     # read --config before doing anything else
>     # (e.g. to change trust settings for reading .hg/hgrc)
> @@ -350,25 +349,13 @@
>         lui.readconfig(os.path.join(path, ".hg", "hgrc"))
>
>     extensions.loadall(lui)
> -    for name, module in extensions.extensions():
> -        if name in _loaded:
> -            continue
> -
> -        # setup extensions
> -        # TODO this should be generalized to scheme, where extensions can
> -        #      redepend on other extensions.  then we should toposort them, and
> -        #      do initialization in correct order
> -        extsetup = getattr(module, 'extsetup', None)
> -        if extsetup:
> -            extsetup()
> -
> +    for name, module in extensions.setupall(lui):
>         cmdtable = getattr(module, '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)
> -        _loaded.add(name)
>
>     addaliases(lui, commands.table)
>
> diff -r 527eddab742d -r 3bc8dde7c38d mercurial/extensions.py
> --- a/mercurial/extensions.py   Mit Jul 29 14:21:18 2009 +0200
> +++ b/mercurial/extensions.py   Mit Aug 12 13:15:46 2009 +0200
> @@ -39,7 +39,7 @@
>     else:
>         return imp.load_source(module_name, path)
>
> -def load(ui, name, path):
> +def load(ui, name, path, init=False):
>     if name.startswith('hgext.') or name.startswith('hgext/'):
>         shortname = name[6:]
>     else:
> @@ -66,9 +66,14 @@
>     _extensions[shortname] = mod
>     _order.append(shortname)
>
> +    if init:
> +        return
>     uisetup = getattr(mod, 'uisetup', None)
>     if uisetup:
>         uisetup(ui)
> +    extsetup = getattr(mod, 'extsetup', None)
> +    if extsetup:
> +        extsetup()
>
>  def loadall(ui):
>     result = ui.configitems("extensions")
> @@ -77,7 +82,7 @@
>             if path[0] == '!':
>                 continue
>         try:
> -            load(ui, name, path)
> +            load(ui, name, path, True)
>         except KeyboardInterrupt:
>             raise
>         except Exception, inst:
> @@ -90,6 +95,24 @@
>             if ui.traceback():
>                 return 1
>
> +_loaded = set()
> +def setupall(ui):
> +    unloaded = []
> +    for name in _order:
> +        if name in _loaded:
> +            continue
> +        mod = _extensions[name]
> +        unloaded.append((name, mod))
> +        _loaded.add(name)
> +        uisetup = getattr(mod, 'uisetup', None)
> +        if uisetup:
> +            uisetup(ui)
> +    for name, mod in unloaded:
> +        extsetup = getattr(mod, 'extsetup', None)
> +        if extsetup:
> +            extsetup()
> +    return unloaded
> +
>  def wrapcommand(table, command, wrapper):
>     aliases, entry = cmdutil.findcmd(command, table)
>     for alias, e in table.iteritems():
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>



More information about the Mercurial-devel mailing list