Mercurial > hg
view tests/test-copy.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 | 973c2b0b403c |
children | 6cc1f388ac80 |
line wrap: on
line source
$ mkdir part1 $ cd part1 $ hg init $ echo a > a $ hg add a $ hg commit -m "1" $ hg status $ hg copy a b $ hg --config ui.portablefilenames=abort copy a con.xml abort: filename contains 'con', which is reserved on Windows: 'con.xml' [255] $ hg status A b $ hg sum parent: 0:c19d34741b0a tip 1 branch: default commit: 1 copied update: (current) $ hg --debug commit -m "2" b b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 committed changeset 1:93580a2c28a50a56f63526fb305067e6fbf739c4 we should see two history entries $ hg history -v changeset: 1:93580a2c28a5 tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 files: b description: 2 changeset: 0:c19d34741b0a user: test date: Thu Jan 01 00:00:00 1970 +0000 files: a description: 1 we should see one log entry for a $ hg log a changeset: 0:c19d34741b0a user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: 1 this should show a revision linked to changeset 0 $ hg debugindex a rev offset length ..... linkrev nodeid p1 p2 (re) 0 0 3 ..... 0 b789fdd96dc2 000000000000 000000000000 (re) we should see one log entry for b $ hg log b changeset: 1:93580a2c28a5 tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: 2 this should show a revision linked to changeset 1 $ hg debugindex b rev offset length ..... linkrev nodeid p1 p2 (re) 0 0 65 ..... 1 37d9b5d994ea 000000000000 000000000000 (re) this should show the rename information in the metadata $ hg debugdata b 0 | head -3 | tail -2 copy: a copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 $ "$TESTDIR/md5sum.py" .hg/store/data/b.i 4999f120a3b88713bbefddd195cf5133 .hg/store/data/b.i $ hg cat b > bsum $ "$TESTDIR/md5sum.py" bsum 60b725f10c9c85c70d97880dfe8191b3 bsum $ hg cat a > asum $ "$TESTDIR/md5sum.py" asum 60b725f10c9c85c70d97880dfe8191b3 asum $ hg verify checking changesets checking manifests crosschecking files in changesets and manifests checking files 2 files, 2 changesets, 2 total revisions $ cd .. $ mkdir part2 $ cd part2 $ hg init $ echo foo > foo should fail - foo is not managed $ hg mv foo bar foo: not copying - file is not managed abort: no files to copy [255] $ hg st -A ? foo $ hg add foo dry-run; print a warning that this is not a real copy; foo is added $ hg mv --dry-run foo bar foo has not been committed yet, so no copy data will be stored for bar. $ hg st -A A foo should print a warning that this is not a real copy; bar is added $ hg mv foo bar foo has not been committed yet, so no copy data will be stored for bar. $ hg st -A A bar should print a warning that this is not a real copy; foo is added $ hg cp bar foo bar has not been committed yet, so no copy data will be stored for foo. $ hg rm -f bar $ rm bar $ hg st -A A foo $ hg commit -m1 moving a missing file $ rm foo $ hg mv foo foo3 foo: deleted in working copy foo3 does not exist! $ hg up -qC . copy --after to a nonexistent target filename $ hg cp -A foo dummy foo: not recording copy - dummy does not exist dry-run; should show that foo is clean $ hg copy --dry-run foo bar $ hg st -A C foo should show copy $ hg copy foo bar $ hg st -C A bar foo shouldn't show copy $ hg commit -m2 $ hg st -C should match $ hg debugindex foo rev offset length ..... linkrev nodeid p1 p2 (re) 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re) $ hg debugrename bar bar renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd $ echo bleah > foo $ echo quux > bar $ hg commit -m3 should not be renamed $ hg debugrename bar bar not renamed $ hg copy -f foo bar should show copy $ hg st -C M bar foo $ hg commit -m3 should show no parents for tip $ hg debugindex bar rev offset length ..... linkrev nodeid p1 p2 (re) 0 0 69 ..... 1 7711d36246cc 000000000000 000000000000 (re) 1 69 6 ..... 2 bdf70a2b8d03 7711d36246cc 000000000000 (re) 2 75 81 ..... 3 b2558327ea8d 000000000000 000000000000 (re) should match $ hg debugindex foo rev offset length ..... linkrev nodeid p1 p2 (re) 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re) 1 5 7 ..... 2 dd12c926cf16 2ed2a3912a0b 000000000000 (re) $ hg debugrename bar bar renamed from foo:dd12c926cf165e3eb4cf87b084955cb617221c17 should show no copies $ hg st -C copy --after on an added file $ cp bar baz $ hg add baz $ hg cp -A bar baz $ hg st -C A baz bar foo was clean: $ hg st -AC foo C foo but it's considered modified after a copy --after --force $ hg copy -Af bar foo $ hg st -AC foo M foo bar $ cd ..