# HG changeset patch # User Kyle Lippincott # Date 2020-12-02 23:38:05 # Node ID 068307b638f45e6bdab09b3030edb2cac2935b64 # Parent 372409eb5cd1069942fa84ef3bec9dcaf2e71da7 statprof: fix off-by-one-line error in output martinvonz claims they thought that this was intentional, but couldn't remember the reasoning for it. I can't understand why it would be preferable, and I didn't see anything in the comments in the file about why this would be useful, so I'm hopefully not breaking anything by "fixing" it. ### Old output ``` | 100.0% 0.01s dispatch.py: run line 43: dispatch.run() | 100.0% 0.01s dispatch.py: dispatch line 115: status = dispatch(req) | 100.0% 0.01s dispatch.py: _runcatch line 266: ret = _runcatch(req) or 0 | 100.0% 0.01s dispatch.py: _callcatch line 442: return _callcatch(ui, _runc... | 100.0% 0.01s scmutil.py: callcatch line 451: return scmutil.callcatch(ui... | 100.0% 0.01s dispatch.py: _runcatchfunc line 155: return func() | 100.0% 0.01s dispatch.py: _dispatch line 432: return _dispatch(req) | 100.0% 0.01s hg.py: repository line 1179: repo = hg.repository( | 100.0% 0.01s hg.py: _peerorrepo line 221: peer = _peerorrepo( | 100.0% 0.01s util.py: __getattribute__ line 188: obj = _peerlookup(path).ins... | 100.0% 0.01s localrepo.py: makelocalrepositoryline 3227: return makelocalrepository(... | 100.0% 0.01s localrepo.py: __init__ line 683: return cls( | 100.0% 0.01s util.py: __getattribute__ line 1262: self._extrafilterid = repov... | 100.0% 0.01s : exec_moduleline 245: self.__spec__.loader.exec_m... | 100.0% 0.01s : get_codeline 779: | 100.0% 0.01s : path_statsline 868: | 100.0% 0.01s : _path_statline 1012: ``` ### New output ``` | 100.0% 0.01s hg: line 43: dispatch.run() | 100.0% 0.01s dispatch.py: run line 115: status = dispatch(req) | 100.0% 0.01s dispatch.py: dispatch line 266: ret = _runcatch(req) or 0 | 100.0% 0.01s dispatch.py: _runcatch line 442: return _callcatch(ui, _runc... | 100.0% 0.01s dispatch.py: _callcatch line 451: return scmutil.callcatch(ui... | 100.0% 0.01s scmutil.py: callcatch line 155: return func() | 100.0% 0.01s dispatch.py: _runcatchfunc line 432: return _dispatch(req) | 100.0% 0.01s dispatch.py: _dispatch line 1179: repo = hg.repository( | 100.0% 0.01s hg.py: repository line 221: peer = _peerorrepo( | 100.0% 0.01s hg.py: _peerorrepo line 188: obj = _peerlookup(path).ins... | 100.0% 0.01s localrepo.py: instance line 3227: return makelocalrepository(... | 100.0% 0.01s localrepo.py: makelocalrepositoryline 683: return cls( | 100.0% 0.01s localrepo.py: __init__ line 1262: self._extrafilterid = repov... | 100.0% 0.01s util.py: __getattribute__ line 245: self.__spec__.loader.exec_m... | 100.0% 0.01s : exec_moduleline 779: | 100.0% 0.01s : get_codeline 868: | 100.0% 0.01s : path_statsline 1012: | 100.0% 0.01s : _path_statline 87: ``` Differential Revision: https://phab.mercurial-scm.org/D9510 diff --git a/mercurial/statprof.py b/mercurial/statprof.py --- a/mercurial/statprof.py +++ b/mercurial/statprof.py @@ -732,6 +732,9 @@ def display_hotpath(data, fp, limit=0.05 i += 1 if i < len(stack): child.add(stack[i:], time) + else: + # Normally this is done by the .add() calls + child.count += time root = HotNode(None) lasttime = data.samples[0].time @@ -749,12 +752,8 @@ def display_hotpath(data, fp, limit=0.05 ] if site: indent = depth * 2 - 1 - filename = b'' - function = b'' - if len(node.children) > 0: - childsite = list(pycompat.itervalues(node.children))[0].site - filename = (childsite.filename() + b':').ljust(15) - function = childsite.function + filename = (site.filename() + b':').ljust(15) + function = site.function # lots of string formatting listpattern = ( diff --git a/tests/test-profile.t b/tests/test-profile.t --- a/tests/test-profile.t +++ b/tests/test-profile.t @@ -100,6 +100,8 @@ Various statprof formatters work $ hg --profile --config profiling.statformat=hotpath sleep 2>../out || cat ../out $ cat ../out | statprofran + $ grep sleepext.py ../out + .* [0-9.]+% [0-9.]+s sleepext.py:\s*sleep line 7: time\.sleep.* (re) $ hg --profile --config profiling.statformat=json sleep 2>../out || cat ../out $ cat ../out