wrapfunction: use functools.partial if possible
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)
....
Differential Revision: https://phab.mercurial-scm.org/D632
#require serve
#if no-outer-repo
no repo
$ hg id
abort: there is no Mercurial repository here (.hg not found)
[255]
#endif
create repo
$ hg init test
$ cd test
$ echo a > a
$ hg ci -Ama
adding a
basic id usage
$ hg id
cb9a9f314b8b tip
$ hg id --debug
cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip
$ hg id -q
cb9a9f314b8b
$ hg id -v
cb9a9f314b8b tip
with options
$ hg id -r.
cb9a9f314b8b tip
$ hg id -n
0
$ hg id -t
tip
$ hg id -b
default
$ hg id -i
cb9a9f314b8b
$ hg id -n -t -b -i
cb9a9f314b8b 0 default tip
$ hg id -Tjson
[
{
"bookmarks": [],
"branch": "default",
"dirty": "",
"id": "cb9a9f314b8b",
"node": "ffffffffffffffffffffffffffffffffffffffff",
"parents": [{"node": "cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b", "rev": 0}],
"tags": ["tip"]
}
]
test template keywords and functions which require changectx:
$ hg id -T '{rev} {node|shortest}\n'
2147483647 ffff
$ hg id -T '{parents % "{rev} {node|shortest} {desc}\n"}'
0 cb9a a
with modifications
$ echo b > a
$ hg id -n -t -b -i
cb9a9f314b8b+ 0+ default tip
$ hg id -Tjson
[
{
"bookmarks": [],
"branch": "default",
"dirty": "+",
"id": "cb9a9f314b8b+",
"node": "ffffffffffffffffffffffffffffffffffffffff",
"parents": [{"node": "cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b", "rev": 0}],
"tags": ["tip"]
}
]
other local repo
$ cd ..
$ hg -R test id
cb9a9f314b8b+ tip
#if no-outer-repo
$ hg id test
cb9a9f314b8b+ tip
#endif
with remote http repo
$ cd test
$ hg serve -p $HGPORT1 -d --pid-file=hg.pid
$ cat hg.pid >> $DAEMON_PIDS
$ hg id http://localhost:$HGPORT1/
cb9a9f314b8b
remote with rev number?
$ hg id -n http://localhost:$HGPORT1/
abort: can't query remote revision number, branch, or tags
[255]
remote with tags?
$ hg id -t http://localhost:$HGPORT1/
abort: can't query remote revision number, branch, or tags
[255]
remote with branch?
$ hg id -b http://localhost:$HGPORT1/
abort: can't query remote revision number, branch, or tags
[255]
test bookmark support
$ hg bookmark Y
$ hg bookmark Z
$ hg bookmarks
Y 0:cb9a9f314b8b
* Z 0:cb9a9f314b8b
$ hg id
cb9a9f314b8b+ tip Y/Z
$ hg id --bookmarks
Y Z
test remote identify with bookmarks
$ hg id http://localhost:$HGPORT1/
cb9a9f314b8b Y/Z
$ hg id --bookmarks http://localhost:$HGPORT1/
Y Z
$ hg id -r . http://localhost:$HGPORT1/
cb9a9f314b8b Y/Z
$ hg id --bookmarks -r . http://localhost:$HGPORT1/
Y Z
test invalid lookup
$ hg id -r noNoNO http://localhost:$HGPORT1/
abort: unknown revision 'noNoNO'!
[255]
Make sure we do not obscure unknown requires file entries (issue2649)
$ echo fake >> .hg/requires
$ hg id
abort: repository requires features unknown to this Mercurial: fake!
(see https://mercurial-scm.org/wiki/MissingRequirement for more information)
[255]
$ cd ..
#if no-outer-repo
$ hg id test
abort: repository requires features unknown to this Mercurial: fake!
(see https://mercurial-scm.org/wiki/MissingRequirement for more information)
[255]
#endif