[PATCH 4 of 5 V2] revset: use delayregistrar to register predicate in extension easily

Yuya Nishihara yuya at tcha.org
Fri Jan 1 08:53:10 UTC 2016


On Wed, 30 Dec 2015 00:08:51 +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1451401110 -32400
> #      Tue Dec 29 23:58:30 2015 +0900
> # Node ID 0aa9cf12fc6ce052b0f2e91674d1c56fe6078939
> # Parent  a1e4c18851155866ab75a35aa5bbae81945d7db5
> revset: use delayregistrar to register predicate in extension easily
> 
> Previous patch introduced 'revset.predicate' decorator to register
> revset predicate function easily.
> 
> But it shouldn't be used in extension directly, because it registers
> specified function immediately. Registration itself can't be restored,
> even if extension loading fails after that.
> 
> Therefore, registration should be delayed until 'uisetup()' or so.
> 
> This patch uses 'extpredicate' decorator derived from 'delayregistrar'
> to register predicate in extension easily.
> 
> This patch also tests whether 'registrar.delayregistrar' avoids
> function registration if 'setup()' isn't invoked on it, because
> 'extpredicate' is the first user of it.

> --- a/hgext/mq.py
> +++ b/hgext/mq.py
> @@ -3558,9 +3558,11 @@ def summaryhook(ui, repo):
>          # i18n: column positioning for "hg summary"
>          ui.note(_("mq:     (empty queue)\n"))
>  
> +revsetpredicate = revset.extpredicate()
> +
> + at revsetpredicate('mq()')
>  def revsetmq(repo, subset, x):
> -    """``mq()``
> -    Changesets managed by MQ.
> +    """Changesets managed by MQ.
>      """
>      revset.getargs(x, 0, 0, _("mq takes no arguments"))
>      applied = set([repo[r.node].rev() for r in repo.mq.applied])
> @@ -3596,7 +3598,7 @@ def extsetup(ui):
>          if extmodule.__file__ != __file__:
>              dotable(getattr(extmodule, 'cmdtable', {}))
>  
> -    revset.symbols['mq'] = revsetmq
> +    revsetpredicate.setup()

"cmdtable" was wrong?

I like consistent extension APIs, so my idea was something like this:

1. define table of revset symbols per extension

  # creates new table and associated decorator
  revsetpredicate = registrar.revsetpredicate()
  # or
  revsetsymbols = {}
  revsetpredicate = registrar.revsetpredicate(revsetsymbols)

  # revsetpredicate['mq'] = revsetmq
  @revsetpredicate('mq()')
  def revsetmq(...):
      ...

2. load them by dispatch._dispatch()


More information about the Mercurial-devel mailing list