Every extensions.bind call inserts a frame in traceback:
... in closure return func(*(args + a), **kw)
which makes traceback noisy.
The Python stdlib has a functools.partial which is backed by C code and
does not pollute traceback. However it does not support instancemethod and
sets args attribute which could be problematic for alias handling.
This patch makes wrapfunction use functools.partial if we are wrapping a
function directly exported by a module (so it's impossible to be a class or
instance method), and special handles wrapfunction results so alias
handling code could handle args just fine.
As an example, hg rebase -s . -d . --traceback got 6 lines removed in my
setup:
File "hg/mercurial/dispatch.py", line 898, in _dispatch cmdpats, cmdoptions) -File "hg/mercurial/extensions.py", line 333, in closure - return func(*(args + a), **kw) File "hg/hgext/journal.py", line 84, in runcommand return orig(lui, repo, cmd, fullargs, *args) -File "hg/mercurial/extensions.py", line 333, in closure - return func(*(args + a), **kw) File "fb-hgext/hgext3rd/fbamend/hiddenoverride.py", line 119, in runcommand result = orig(lui, repo, cmd, fullargs, *args) File "hg/mercurial/dispatch.py", line 660, in runcommand ret = _runcommand(ui, options, cmd, d) -File "hg/mercurial/extensions.py", line 333, in closure - return func(*(args + a), **kw) File "hg/hgext/pager.py", line 69, in pagecmd return orig(ui, options, cmd, cmdfunc) ....
This patch makes test-py3-commands.t fail. I suspect it's because py3 has no "im_self".