Mercurial > hg
view tests/test-qrecord.t @ 20182:04036798ebed
branches: avoid unnecessary changectx.branch() calls
This requires reading from the changelog, which can be costly over NFS.
Note that this does not totally remove reading from the changelog; we
still do that when calling changectx.closesbranch(). That call will be
removed in a later patch.
Running hg branches on the PyPy repo (with 996) over a busy NFS server,
before this change:
$ time hg --profile branches > /dev/null
CallCount Recursive Total(s) Inline(s) module:lineno(function)
2042 0 2.2827 2.2827 <open>
2036 0 0.9840 0.9840 <method 'close' of 'file' objects>
2036 0 0.0464 0.0464 <method 'read' of 'file' objects>
5233 0 0.1985 0.0453 mercurial.repoview:161(changelog)
10462 0 0.0791 0.0314 mercurial.changelog:133(tip)
5233 0 0.0388 0.0176 mercurial.localrepo:26(__get__)
10462 0 0.0250 0.0126 <len>
5233 0 0.0059 0.0039 mercurial.repoview:112(filterrevs)
10462 0 0.0029 0.0029 <hash>
2034 0 0.0444 0.0444 <method 'seek' of 'file' objects>
5340 0 0.0390 0.0390 mercurial.revlog:296(rev)
2582 0 0.0371 0.0371 <zlib.decompress>
3155 0 0.1963 0.0366 mercurial.context:202(__init__)
3155 0 0.1238 0.0306 mercurial.repoview:161(changelog)
3155 0 0.0261 0.0080 mercurial.changelog:183(rev)
9465 0 0.0061 0.0061 <isinstance>
1096 0 0.0023 0.0023 <binascii.unhexlify>
4251 0 0.0014 0.0014 <len>
2059 0 3.7341 0.0332 mercurial.changelog:270(read)
2059 0 3.6304 0.0307 mercurial.revlog:907(revision)
2057 0 0.0262 0.0137 mercurial.changelog:28(decodeextra)
4118 0 0.0094 0.0094 <method 'split' of 'str' objects>
4118 0 0.0270 0.0048 mercurial.encoding:61(tolocal)
2059 0 0.0040 0.0040 <method 'index' of 'str' objects>
10462 0 0.0791 0.0314 mercurial.changelog:133(tip)
10462 0 0.0289 0.0207 mercurial.changelog:190(node)
10462 0 0.0188 0.0091 <len>
52433 20932 0.0478 0.0310 <len>
20932 0 0.0221 0.0168 mercurial.revlog:262(__len__)
2059 0 3.6304 0.0307 mercurial.revlog:907(revision)
real 0m4.361s
user 0m0.986s
sys 0m0.237s
After this change:
$ time hg --profile branches > /dev/null
CallCount Recursive Total(s) Inline(s) module:lineno(function)
1069 0 1.1098 1.1098 <open>
1063 0 0.4865 0.4865 <method 'close' of 'file' objects>
4122 0 0.1811 0.0404 mercurial.repoview:161(changelog)
8240 0 0.0712 0.0272 mercurial.changelog:133(tip)
4122 0 0.0378 0.0177 mercurial.localrepo:26(__get__)
8240 0 0.0221 0.0115 <len>
4122 0 0.0057 0.0033 mercurial.repoview:112(filterrevs)
8240 0 0.0025 0.0025 <hash>
3029 0 0.1979 0.0371 mercurial.context:202(__init__)
3029 0 0.1278 0.0310 mercurial.repoview:161(changelog)
3029 0 0.0230 0.0081 mercurial.changelog:183(rev)
9087 0 0.0061 0.0061 <isinstance>
1096 0 0.0026 0.0026 <binascii.unhexlify>
4125 0 0.0014 0.0014 <len>
4229 0 0.0337 0.0337 mercurial.revlog:296(rev)
1061 0 0.0296 0.0296 <method 'seek' of 'file' objects>
1063 0 0.0292 0.0292 <method 'read' of 'file' objects>
8240 0 0.0712 0.0272 mercurial.changelog:133(tip)
8240 0 0.0271 0.0196 mercurial.changelog:190(node)
8240 0 0.0169 0.0083 <len>
40476 16488 0.0422 0.0271 <len>
16488 0 0.0193 0.0152 mercurial.revlog:262(__len__)
1342 0 0.0241 0.0241 <zlib.decompress>
9445 0 0.0336 0.0224 mercurial.changelog:190(node)
9445 0 0.0112 0.0112 mercurial.revlog:317(node)
1074 0 1.9102 0.0224 mercurial.changelog:270(read)
1074 0 1.8397 0.0202 mercurial.revlog:907(revision)
1073 0 0.0187 0.0099 mercurial.changelog:28(decodeextra)
2148 0 0.0061 0.0061 <method 'split' of 'str' objects>
2148 0 0.0184 0.0034 mercurial.encoding:61(tolocal)
real 0m2.402s
user 0m0.735s
sys 0m0.177s
author | Brodie Rao <brodie@sf.io> |
---|---|
date | Fri, 15 Nov 2013 23:18:08 -0500 |
parents | 29c726e9c3ab |
children | 422981492ace |
line wrap: on
line source
Create configuration $ echo "[ui]" >> $HGRCPATH $ echo "interactive=true" >> $HGRCPATH help record (no record) $ hg help record record extension - commands to interactively select changes for commit/qrefresh use "hg help extensions" for information on enabling extensions help qrecord (no record) $ hg help qrecord 'qrecord' is provided by the following extension: record commands to interactively select changes for commit/qrefresh use "hg help extensions" for information on enabling extensions $ echo "[extensions]" >> $HGRCPATH $ echo "record=" >> $HGRCPATH help record (record) $ hg help record hg record [OPTION]... [FILE]... interactively select changes to commit If a list of files is omitted, all changes reported by "hg status" will be candidates for recording. See "hg help dates" for a list of formats valid for -d/--date. You will be prompted for whether to record changes to each modified file, and for files with multiple changes, for each change to use. For each query, the following responses are possible: y - record this change n - skip this change e - edit this change manually s - skip remaining changes to this file f - record remaining changes to this file d - done, skip remaining changes and files a - record all changes to all remaining files q - quit, recording no changes ? - display help This command is not available when committing a merge. options: -A --addremove mark new/missing files as added/removed before committing --close-branch mark a branch as closed, hiding it from the branch list --amend amend the parent of the working dir -s --secret use the secret phase for committing -I --include PATTERN [+] include names matching the given patterns -X --exclude PATTERN [+] exclude names matching the given patterns -m --message TEXT use text as commit message -l --logfile FILE read commit message from file -d --date DATE record the specified date as commit date -u --user USER record the specified user as committer -S --subrepos recurse into subrepositories -w --ignore-all-space ignore white space when comparing lines -b --ignore-space-change ignore changes in the amount of white space -B --ignore-blank-lines ignore changes whose lines are all blank [+] marked option can be specified multiple times use "hg -v help record" to show the global options help (no mq, so no qrecord) $ hg help qrecord hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See "hg help qnew" & "hg help record" for more information and usage. use "hg -v help qrecord" to show the global options $ hg init a qrecord (mq not present) $ hg -R a qrecord hg qrecord: invalid arguments hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch use "hg help qrecord" to show the full help text [255] qrecord patch (mq not present) $ hg -R a qrecord patch abort: 'mq' extension not loaded [255] help (bad mq) $ echo "mq=nonexistent" >> $HGRCPATH $ hg help qrecord *** failed to import extension mq from nonexistent: [Errno *] * (glob) hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See "hg help qnew" & "hg help record" for more information and usage. use "hg -v help qrecord" to show the global options help (mq present) $ sed 's/mq=nonexistent/mq=/' $HGRCPATH > hgrc.tmp $ mv hgrc.tmp $HGRCPATH $ hg help qrecord hg qrecord [OPTION]... PATCH [FILE]... interactively record a new patch See "hg help qnew" & "hg help record" for more information and usage. options: -e --edit edit commit message -g --git use git extended diff format -U --currentuser add "From: <current user>" to patch -u --user USER add "From: <USER>" to patch -D --currentdate add "Date: <current date>" to patch -d --date DATE add "Date: <DATE>" to patch -I --include PATTERN [+] include names matching the given patterns -X --exclude PATTERN [+] exclude names matching the given patterns -m --message TEXT use text as commit message -l --logfile FILE read commit message from file -w --ignore-all-space ignore white space when comparing lines -b --ignore-space-change ignore changes in the amount of white space -B --ignore-blank-lines ignore changes whose lines are all blank --mq operate on patch repository [+] marked option can be specified multiple times use "hg -v help qrecord" to show the global options $ cd a Base commit $ cat > 1.txt <<EOF > 1 > 2 > 3 > 4 > 5 > EOF $ cat > 2.txt <<EOF > a > b > c > d > e > f > EOF $ mkdir dir $ cat > dir/a.txt <<EOF > hello world > > someone > up > there > loves > me > EOF $ hg add 1.txt 2.txt dir/a.txt $ hg commit -m 'initial checkin' Changing files $ sed -e 's/2/2 2/;s/4/4 4/' 1.txt > 1.txt.new $ sed -e 's/b/b b/' 2.txt > 2.txt.new $ sed -e 's/hello world/hello world!/' dir/a.txt > dir/a.txt.new $ mv -f 1.txt.new 1.txt $ mv -f 2.txt.new 2.txt $ mv -f dir/a.txt.new dir/a.txt Whole diff $ hg diff --nodates diff -r 1057167b20ef 1.txt --- a/1.txt +++ b/1.txt @@ -1,5 +1,5 @@ 1 -2 +2 2 3 -4 +4 4 5 diff -r 1057167b20ef 2.txt --- a/2.txt +++ b/2.txt @@ -1,5 +1,5 @@ a -b +b b c d e diff -r 1057167b20ef dir/a.txt --- a/dir/a.txt +++ b/dir/a.txt @@ -1,4 +1,4 @@ -hello world +hello world! someone up qrecord with bad patch name, should abort before prompting $ hg qrecord .hg abort: patch name cannot begin with ".hg" [255] qrecord a.patch $ hg qrecord -d '0 0' -m aaa a.patch <<EOF > y > y > n > y > y > n > EOF diff --git a/1.txt b/1.txt 2 hunks, 2 lines changed examine changes to '1.txt'? [Ynesfdaq?] @@ -1,3 +1,3 @@ 1 -2 +2 2 3 record change 1/4 to '1.txt'? [Ynesfdaq?] @@ -3,3 +3,3 @@ 3 -4 +4 4 5 record change 2/4 to '1.txt'? [Ynesfdaq?] diff --git a/2.txt b/2.txt 1 hunks, 1 lines changed examine changes to '2.txt'? [Ynesfdaq?] @@ -1,5 +1,5 @@ a -b +b b c d e record change 3/4 to '2.txt'? [Ynesfdaq?] diff --git a/dir/a.txt b/dir/a.txt 1 hunks, 1 lines changed examine changes to 'dir/a.txt'? [Ynesfdaq?] After qrecord a.patch 'tip'" $ hg tip -p changeset: 1:5d1ca63427ee tag: a.patch tag: qbase tag: qtip tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: aaa diff -r 1057167b20ef -r 5d1ca63427ee 1.txt --- a/1.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ 1 -2 +2 2 3 4 5 diff -r 1057167b20ef -r 5d1ca63427ee 2.txt --- a/2.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/2.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ a -b +b b c d e After qrecord a.patch 'diff'" $ hg diff --nodates diff -r 5d1ca63427ee 1.txt --- a/1.txt +++ b/1.txt @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 diff -r 5d1ca63427ee dir/a.txt --- a/dir/a.txt +++ b/dir/a.txt @@ -1,4 +1,4 @@ -hello world +hello world! someone up qrecord b.patch $ hg qrecord -d '0 0' -m bbb b.patch <<EOF > y > y > y > y > EOF diff --git a/1.txt b/1.txt 1 hunks, 1 lines changed examine changes to '1.txt'? [Ynesfdaq?] @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 record change 1/2 to '1.txt'? [Ynesfdaq?] diff --git a/dir/a.txt b/dir/a.txt 1 hunks, 1 lines changed examine changes to 'dir/a.txt'? [Ynesfdaq?] @@ -1,4 +1,4 @@ -hello world +hello world! someone up record change 2/2 to 'dir/a.txt'? [Ynesfdaq?] After qrecord b.patch 'tip' $ hg tip -p changeset: 2:b056198bf878 tag: b.patch tag: qtip tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: bbb diff -r 5d1ca63427ee -r b056198bf878 1.txt --- a/1.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +1,5 @@ 1 2 2 3 -4 +4 4 5 diff -r 5d1ca63427ee -r b056198bf878 dir/a.txt --- a/dir/a.txt Thu Jan 01 00:00:00 1970 +0000 +++ b/dir/a.txt Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +1,4 @@ -hello world +hello world! someone up After qrecord b.patch 'diff' $ hg diff --nodates $ cd ..