[PATCH 1 of 3] extensions: set attributes to wrappers so we can trace them back

Martijn Pieters mj at zopatista.com
Fri Jul 1 08:30:13 EDT 2016


On 1 July 2016 at 13:09, Jun Wu <quark at fb.com> wrote:
> # HG changeset patch
> # User Jun Wu <quark at fb.com>
> # Date 1467370013 -3600
> #      Fri Jul 01 11:46:53 2016 +0100
> # Node ID 21e49b9facede184e5d262211bd5cc34bddca974
> # Parent  7dce56174916e09be39c690278942b4f7567b3f6
> # Available At https://bitbucket.org/quark-zju/hg-draft
> #              hg pull https://bitbucket.org/quark-zju/hg-draft -r 21e49b9faced
> extensions: set attributes to wrappers so we can trace them back
>
> This patch adds two attributes about the original function and the unbound
> wrapper. It allows us to get a chain of wrappers. See the next patch.
>
> diff --git a/mercurial/extensions.py b/mercurial/extensions.py
> --- a/mercurial/extensions.py
> +++ b/mercurial/extensions.py
> @@ -204,11 +204,13 @@ def bind(func, *args):
>          return func(*(args + a), **kw)
>      return closure
>
> -def _updatewrapper(wrap, origfn):
> -    '''Copy attributes to wrapper function'''
> +def _updatewrapper(wrap, origfn, unboundwrapper):
> +    '''Copy and add some useful attributes to wrapper'''
>      wrap.__module__ = getattr(origfn, '__module__')
>      wrap.__doc__ = getattr(origfn, '__doc__')
>      wrap.__dict__.update(getattr(origfn, '__dict__', {}))
> +    wrap._origfunc = origfn

Python 3.2 and newer use `__wrapped__` as the attribute name (set by
functools.wraps and others), and introspection tools make use of this.
I'd say using that name here fits the usecase for that attribute
exactly.

> +    wrap._unboundwrapper = unboundwrapper
>
>  def wrapcommand(table, command, wrapper, synopsis=None, docstring=None):
>      '''Wrap the command named `command' in table
> @@ -248,7 +250,7 @@ def wrapcommand(table, command, wrapper,
>
>      origfn = entry[0]
>      wrap = bind(util.checksignature(wrapper), util.checksignature(origfn))
> -    _updatewrapper(wrap, origfn)
> +    _updatewrapper(wrap, origfn, wrapper)
>      if docstring is not None:
>          wrap.__doc__ += docstring
>
> @@ -297,7 +299,7 @@ def wrapfunction(container, funcname, wr
>      origfn = getattr(container, funcname)
>      assert callable(origfn)
>      wrap = bind(wrapper, origfn)
> -    _updatewrapper(wrap, origfn)
> +    _updatewrapper(wrap, origfn, wrapper)
>      setattr(container, funcname, wrap)
>      return origfn
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



-- 
Martijn Pieters


More information about the Mercurial-devel mailing list