[PATCH] hooks: hook ordering via sort variable in [hooks]
Matt Mackall
mpm at selenic.com
Sun Jan 15 18:01:39 CST 2012
On Sun, 2012-01-15 at 14:21 -0700, Matt Zuba wrote:
> > Your emailer is mangling your patches.
>
> Sorry for the mangled patch; I changed my Thunderbird settings so
> hopefully that doesn't happen this time around. If so, I'll just
> resubmit the new patch with patchbomb.
>
> > Using a heap here is overkill. I would do something like:
>
> I'm still fairly new to Python, still learning my way around, thanks for
> the suggestion. Here is a new patch:
This looks good, queued for default.
> # HG changeset patch
> # User Matt Zuba <matt.zuba at goodwillaz.org>
> # Date 1326660612 25200
> # Node ID 986b56a0e64c14117edfc51024a33100bdd730f1
> # Parent e5feebc1f3bb50f0180c76d31e8456a390a86c78
> hooks: prioritize run order of hooks
>
> As of Mercurial 1.3, hooks are sorted in the order they are read into
> Mercurial. There are many instances when someone may want the hooks
> sorted in a specific order; this patch allows prioritizing hooks, while
> maintaining the existing enumeration for hooks without a priority.
>
> diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
> --- a/mercurial/help/config.txt
> +++ b/mercurial/help/config.txt
> @@ -655,7 +655,10 @@
> various actions such as starting or finishing a commit. Multiple
> hooks can be run for the same action by appending a suffix to the
> action. Overriding a site-wide hook can be done by changing its
> -value or setting it to an empty string.
> +value or setting it to an empty string. Hooks can be prioritized
> +by adding a prefix of ``priority`` to the hook name on a new line
> +and setting the priority. The default priority is 0 if
> +not specified.
>
> Example ``.hg/hgrc``::
>
> @@ -666,6 +669,8 @@
> incoming =
> incoming.email = /my/email/hook
> incoming.autobuild = /my/build/hook
> + # force autobuild hook to run before other incoming hooks
> + priority.incoming.autobuild = 1
>
> Most hooks are run with environment variables set that give useful
> additional information. For each hook below, the environment
> diff --git a/mercurial/hook.py b/mercurial/hook.py
> --- a/mercurial/hook.py
> +++ b/mercurial/hook.py
> @@ -124,6 +124,14 @@
> ui.warn(_('warning: %s hook %s\n') % (name, desc))
> return r
>
> +def _allhooks(ui):
> + hooks = []
> + for name, cmd in ui.configitems('hooks'):
> + if not name.startswith('priority'):
> + priority = ui.configint('hooks', 'priority.%s' % name, 0)
> + hooks.append((-priority, len(hooks), name, cmd))
> + return [(k, v) for p, o, k, v in sorted(hooks)]
> +
> _redirect = False
> def redirect(state):
> global _redirect
> @@ -147,7 +155,7 @@
> pass
>
> try:
> - for hname, cmd in ui.configitems('hooks'):
> + for hname, cmd in _allhooks(ui):
> if hname.split('.')[0] != name or not cmd:
> continue
> if util.safehasattr(cmd, '__call__'):
> diff --git a/tests/test-hook.t b/tests/test-hook.t
> --- a/tests/test-hook.t
> +++ b/tests/test-hook.t
> @@ -553,3 +553,19 @@
> calling hook pre-identify: hooktests.verbosehook
> verbose output from hook
> cb9a9f314b8b
> +
> +Ensure hooks can be prioritized
> +
> + $ echo '[hooks]' > .hg/hgrc
> + $ echo 'pre-identify.a = python:hooktests.verbosehook' >> .hg/hgrc
> + $ echo 'pre-identify.b = python:hooktests.verbosehook' >> .hg/hgrc
> + $ echo 'priority.pre-identify.b = 1' >> .hg/hgrc
> + $ echo 'pre-identify.c = python:hooktests.verbosehook' >> .hg/hgrc
> + $ hg id --verbose
> + calling hook pre-identify.b: hooktests.verbosehook
> + verbose output from hook
> + calling hook pre-identify.a: hooktests.verbosehook
> + verbose output from hook
> + calling hook pre-identify.c: hooktests.verbosehook
> + verbose output from hook
> + cb9a9f314b8b
--
Mathematics is the supreme nostalgia of our time.
More information about the Mercurial-devel
mailing list