statprof: separate functions and "line", assume 4 digit line numbers
Previously, the profile output looked like this (I've removed many lines that
are mostly inconsequential):
```
| 100.0% 0.02s hg: <module> line 43: dispatch.run()
| 100.0% 0.02s dispatch.py: run line 115: status = dispatch(req)
| 100.0% 0.02s dispatch.py: _runcatchfunc line 432: return _dispatch(req)
\ 50.0% 0.01s dispatch.py: _dispatch line 1228: return runcommand(
| 50.0% 0.01s dispatch.py: runcommand line 883: ret = _runcommand(ui, optio...
| 50.0% 0.01s dispatch.py: _runcommand line 1240: return cmdfunc()
| 50.0% 0.01s localrepo.py: __getitem__ line 1670: quick_access = self._quick_...
| 50.0% 0.01s localrepo.py: _quick_access_changeidline 1650: return self._quick_access_c...
| 50.0% 0.01s localrepo.py: __get__ line 179: return getattr(unfi, self.n...
| 50.0% 0.01s util.py: __get__ line 1747: result = self.func(obj)
| 50.0% 0.01s localrepo.py: _quick_access_changeid_wcline 1611: cl = self.unfiltered().chan...
| 50.0% 0.01s localrepo.py: __get__ line 110: return super(_basefilecache...
| 50.0% 0.01s util.py: __getattribute__line 245: self.__spec__.loader.exec_m...
| 50.0% 0.01s <frozen importlib._bootstrap_external>: exec_moduleline 783:
| 50.0% 0.01s <frozen importlib._bootstrap>: _call_with_frames_removedline 219:
| 50.0% 0.01s changelog.py: <module> line 376: class changelog(revlog.revl...
| 50.0% 0.01s util.py: __getattribute__line 245: self.__spec__.loader.exec_m...
| 50.0% 0.01s <frozen importlib._bootstrap_external>: exec_moduleline 779:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: get_codeline 868:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: path_statsline 1012:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: _path_statline 87:
```
This has a few problems, though I'm only addressing some of them.
1. If the stuff before "line ###" is long, there's no separation between the
function name and the "line" string.
2. If the stuff before "line ###" is really long, there's excessive separation
between the "line" string and the line number.
3. We frequently have 4-digit line numbers, the code on the right wasn't
dynamically indented and ended up quite messy looking.
To solve these problems, I've added a ", " prefix before "line" iff it would
otherwise not have any separation such as spaces. I've added a 'max' so that we
never use a negative width (which is the cause of problem #2 above), and I've
added a default assumption of 4 digit line numbers (but again using a 'max' so
this shouldn't cause problems if we go beyond that.
With these changes, it now looks like this:
```
| 100.0% 0.02s hg: <module> line 43: dispatch.run()
| 100.0% 0.02s dispatch.py: run line 115: status = dispatch(req)
| 100.0% 0.02s dispatch.py: _runcatchfunc line 432: return _dispatch(req)
\ 50.0% 0.01s dispatch.py: _dispatch line 1228: return runcommand(
| 50.0% 0.01s dispatch.py: runcommand line 883: ret = _runcommand(ui, optio...
| 50.0% 0.01s dispatch.py: _runcommand line 1240: return cmdfunc()
| 50.0% 0.01s localrepo.py: __getitem__ line 1670: quick_access = self._quick_...
| 50.0% 0.01s localrepo.py: _quick_access_changeid, line 1650: return self._quick_access_c...
| 50.0% 0.01s localrepo.py: __get__ line 179: return getattr(unfi, self.n...
| 50.0% 0.01s util.py: __get__ line 1747: result = self.func(obj)
| 50.0% 0.01s localrepo.py: _quick_access_changeid_wc, line 1611: cl = self.unfiltered().chan...
| 50.0% 0.01s localrepo.py: __get__ line 110: return super(_basefilecache...
| 50.0% 0.01s util.py: __getattribute__, line 245: self.__spec__.loader.exec_m...
| 50.0% 0.01s <frozen importlib._bootstrap_external>: exec_module, line 783:
| 50.0% 0.01s <frozen importlib._bootstrap>: _call_with_frames_removed, line 219:
| 50.0% 0.01s changelog.py: <module> line 376: class changelog(revlog.revl...
| 50.0% 0.01s util.py: __getattribute__, line 245: self.__spec__.loader.exec_m...
| 50.0% 0.01s <frozen importlib._bootstrap_external>: exec_module, line 779:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: get_code, line 868:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: path_stats, line 1012:
| 50.0% 0.01s <frozen importlib._bootstrap_external>: _path_stat, line 87:
```
Differential Revision: https://phab.mercurial-scm.org/D9511
=====================
Test workflow options
=====================
$ . "$TESTDIR/testlib/obsmarker-common.sh"
Test single head enforcing - Setup
=============================================
$ cat << EOF >> $HGRCPATH
> [experimental]
> evolution = all
> EOF
$ hg init single-head-server
$ cd single-head-server
$ cat <<EOF >> .hg/hgrc
> [phases]
> publish = no
> [experimental]
> single-head-per-branch = yes
> EOF
$ mkcommit ROOT
$ mkcommit c_dA0
$ cd ..
$ hg clone single-head-server client
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Test single head enforcing - with branch only
---------------------------------------------
$ cd client
continuing the current defaultbranch
$ mkcommit c_dB0
$ hg push
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
creating a new branch
$ hg up 'desc("ROOT")'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg branch branch_A
marked working directory as branch branch_A
(branches are permanent and global, did you want a bookmark?)
$ mkcommit c_aC0
$ hg push --new-branch
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
Create a new head on the default branch
$ hg up 'desc("c_dA0")'
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit c_dD0
created new head
$ hg push -f
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: rejecting multiple heads on branch "default"
(2 heads: 286d02a6e2a2 9bf953aa81f6)
[255]
remerge them
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ mkcommit c_dE0
$ hg push
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 2 files
Test single head enforcing - after rewrite
------------------------------------------
$ mkcommit c_dF0
$ hg push
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ hg commit --amend -m c_dF1
$ hg push
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 1 files (+1 heads)
1 new obsolescence markers
obsoleted 1 changesets
Check it does not interfer with strip
-------------------------------------
setup
$ hg branch branch_A --force
marked working directory as branch branch_A
$ mkcommit c_aG0
created new head
$ hg update 'desc("c_dF1")'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ mkcommit c_dH0
$ hg update 'desc("c_aG0")'
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ mkcommit c_aI0
$ hg log -G
@ changeset: 10:49003e504178
|\ branch: branch_A
| | tag: tip
| | parent: 8:a33fb808fb4b
| | parent: 3:840af1c6bc88
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | summary: c_aI0
| |
| | o changeset: 9:fe47ea669cea
| | | parent: 7:99a2dc242c5d
| | | user: test
| | | date: Thu Jan 01 00:00:00 1970 +0000
| | | summary: c_dH0
| | |
| o | changeset: 8:a33fb808fb4b
| |/ branch: branch_A
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | summary: c_aG0
| |
| o changeset: 7:99a2dc242c5d
| | parent: 5:6ed1df20edb1
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | summary: c_dF1
| |
| o changeset: 5:6ed1df20edb1
| |\ parent: 4:9bf953aa81f6
| | | parent: 2:286d02a6e2a2
| | | user: test
| | | date: Thu Jan 01 00:00:00 1970 +0000
| | | summary: c_dE0
| | |
| | o changeset: 4:9bf953aa81f6
| | | parent: 1:134bc3852ad2
| | | user: test
| | | date: Thu Jan 01 00:00:00 1970 +0000
| | | summary: c_dD0
| | |
o | | changeset: 3:840af1c6bc88
| | | branch: branch_A
| | | parent: 0:ea207398892e
| | | user: test
| | | date: Thu Jan 01 00:00:00 1970 +0000
| | | summary: c_aC0
| | |
| o | changeset: 2:286d02a6e2a2
| |/ user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | summary: c_dB0
| |
| o changeset: 1:134bc3852ad2
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: c_dA0
|
o changeset: 0:ea207398892e
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: ROOT
actual stripping
$ hg strip --config extensions.strip= --rev 'desc("c_dH0")'
saved backup bundle to $TESTTMP/client/.hg/strip-backup/fe47ea669cea-a41bf5a9-backup.hg
Test that closing heads are ignored by default
-----------------------------------------------
$ hg up 'desc("c_aG0")'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ mkcommit c_aJ0
created new head
pushing the new head should fails
$ hg push -f
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: rejecting multiple heads on branch "branch_A"
(2 heads: 49003e504178 468bd81ccc5d)
[255]
closing the head and pushing should succeed
$ mkcommit c_aK0 --close-branch
$ hg push -f
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 4 changes to 4 files (-1 heads)
Test that closing heads can be explicitly accounted for
-------------------------------------------------------
$ cat <<EOF >> $TESTTMP/single-head-server/.hg/hgrc
> [experimental]
> single-head-per-branch:account-closed-heads = yes
> EOF
$ hg up 'desc("c_aG0")'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ mkcommit c_aL0
created new head
$ mkcommit c_aM0 --close-branch
$ hg push -f
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: rejecting multiple heads on branch "branch_A"
(3 heads: 49003e504178 5254bcccab93 42b9fe70a3c1)
[255]
Test that config can be overriden as the boolean it is
------------------------------------------------------
$ cat <<EOF >> $TESTTMP/single-head-server/.hg/hgrc
> [experimental]
> single-head-per-branch = no
> EOF
Because of previous test, we'll also push c_aL0 and c_aM0.
$ hg out -T "{desc}\n"
comparing with $TESTTMP/single-head-server
searching for changes
c_aL0
c_aM0
Let's make a new head and push everythin. The server feedback will mention
exactly one new head because c_aM0 is closed.
$ hg up 'desc("c_aG0")'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ mkcommit c_aN0
created new head
$ hg push -f
pushing to $TESTTMP/single-head-server
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 3 files (+1 heads)