branches: simplify with repo.branchmap().iterbranches()
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)
1069 0 1.2955 1.2955 <open>
1063 0 0.5576 0.5576 <method 'close' of 'file' objects>
4122 0 0.1993 0.0449 mercurial.repoview:161(changelog)
8240 0 0.0771 0.0299 mercurial.changelog:133(tip)
4122 0 0.0422 0.0204 mercurial.localrepo:26(__get__)
8240 0 0.0252 0.0131 <len>
4122 0 0.0060 0.0037 mercurial.repoview:112(filterrevs)
8240 0 0.0028 0.0028 <hash>
3029 0 0.2139 0.0390 mercurial.context:202(__init__)
3029 0 0.1402 0.0339 mercurial.repoview:161(changelog)
3029 0 0.0240 0.0087 mercurial.changelog:183(rev)
9087 0 0.0067 0.0067 <isinstance>
1096 0 0.0025 0.0025 <binascii.unhexlify>
4125 0 0.0015 0.0015 <len>
4229 0 0.0344 0.0344 mercurial.revlog:296(rev)
1061 0 0.0343 0.0343 <method 'seek' of 'file' objects>
1063 0 0.0339 0.0339 <method 'read' of 'file' objects>
40476 16488 0.0479 0.0311 <len>
16488 0 0.0216 0.0168 mercurial.revlog:262(__len__)
8240 0 0.0771 0.0299 mercurial.changelog:133(tip)
8240 0 0.0281 0.0203 mercurial.changelog:190(node)
8240 0 0.0191 0.0095 <len>
1342 0 0.0278 0.0278 <zlib.decompress>
1074 0 2.2143 0.0266 mercurial.changelog:270(read)
1074 0 2.1328 0.0230 mercurial.revlog:907(revision)
1073 0 0.0208 0.0108 mercurial.changelog:28(decodeextra)
2148 0 0.0072 0.0072 <method 'split' of 'str' objects>
2148 0 0.0211 0.0038 mercurial.encoding:61(tolocal)
1074 0 0.0028 0.0028 <method 'index' of 'str' objects>
1061 0 1.9811 0.0237 mercurial.revlog:817(_loadchunk)
real 0m2.742s
user 0m0.811s
sys 0m0.188s
After this change:
$ time hg --profile branches > /dev/null
CallCount Recursive Total(s) Inline(s) module:lineno(function)
2092 0 0.1444 0.0292 mercurial.context:202(__init__)
2092 0 0.0908 0.0216 mercurial.repoview:161(changelog)
2092 0 0.0164 0.0057 mercurial.changelog:183(rev)
6276 0 0.0045 0.0045 <isinstance>
1096 0 0.0024 0.0024 <binascii.unhexlify>
3188 0 0.0013 0.0013 <len>
2218 0 0.0230 0.0230 mercurial.revlog:296(rev)
2111 0 0.1028 0.0218 mercurial.repoview:161(changelog)
4218 0 0.0387 0.0146 mercurial.changelog:133(tip)
2111 0 0.0238 0.0104 mercurial.localrepo:26(__get__)
4218 0 0.0122 0.0062 <len>
2111 0 0.0038 0.0021 mercurial.repoview:112(filterrevs)
4218 0 0.0014 0.0014 <hash>
20240 8444 0.0233 0.0149 <len>
8444 0 0.0110 0.0084 mercurial.revlog:262(__len__)
4218 0 0.0387 0.0146 mercurial.changelog:133(tip)
4218 0 0.0144 0.0103 mercurial.changelog:190(node)
4218 0 0.0097 0.0048 <len>
2398 1 0.0271 0.0115 mercurial.localrepo:26(__get__)
2398 1 0.0146 0.0046 mercurial.scmutil:939(__get__)
2124 0 0.0009 0.0009 mercurial.localrepo:330(unfiltered)
274 0 0.0002 0.0002 mercurial.repoview:192(unfiltered)
4 0 0.1409 0.0112 mercurial.branchmap:19(read)
1096 0 0.1113 0.0028 mercurial.localrepo:407(__contains__)
1098 0 0.0020 0.0020 <method 'split' of 'str' objects>
1097 0 0.0019 0.0019 <binascii.unhexlify>
1096 0 0.0093 0.0018 mercurial.encoding:61(tolocal)
1096 0 0.0010 0.0010 <method 'append' of 'list' objects>
4349 0 0.0150 0.0105 mercurial.changelog:190(node)
4349 0 0.0045 0.0045 mercurial.revlog:317(node)
real 0m0.362s
user 0m0.329s
sys 0m0.024s
Setup extension:
$ echo "[extensions]" >> $HGRCPATH
$ echo "mq =" >> $HGRCPATH
$ echo "[mq]" >> $HGRCPATH
$ echo "git = keep" >> $HGRCPATH
Test merge with mq changeset as the second parent:
$ hg init m
$ cd m
$ touch a b c
$ hg add a
$ hg commit -m a
$ hg add b
$ hg qnew -d "0 0" b
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg add c
$ hg commit -m c
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m merge
abort: cannot commit over an applied mq patch
[255]
$ cd ..
Issue529: mq aborts when merging patch deleting files
$ checkundo()
> {
> if [ -f .hg/store/undo ]; then
> echo ".hg/store/undo still exists"
> fi
> }
Commit two dummy files in "init" changeset:
$ hg init t
$ cd t
$ echo a > a
$ echo b > b
$ hg ci -Am init
adding a
adding b
$ hg tag -l init
Create a patch removing a:
$ hg qnew rm_a
$ hg rm a
$ hg qrefresh -m "rm a"
Save the patch queue so we can merge it later:
$ hg qsave -c -e
copy $TESTTMP/t/.hg/patches to $TESTTMP/t/.hg/patches.1 (glob)
$ checkundo
Update b and commit in an "update" changeset:
$ hg up -C init
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo b >> b
$ hg st
M b
$ hg ci -m update
created new head
# Here, qpush used to abort with :
# The system cannot find the file specified => a
$ hg manifest
a
b
$ hg qpush -a -m
merging with queue at: $TESTTMP/t/.hg/patches.1 (glob)
applying rm_a
now at: rm_a
$ checkundo
$ hg manifest
b
Ensure status is correct after merge:
$ hg qpop -a
popping rm_a
popping .hg.patches.merge.marker
patch queue now empty
$ cd ..
Classic MQ merge sequence *with an explicit named queue*:
$ hg init t2
$ cd t2
$ echo '[diff]' > .hg/hgrc
$ echo 'nodates = 1' >> .hg/hgrc
$ echo a > a
$ hg ci -Am init
adding a
$ echo b > a
$ hg ci -m changea
$ hg up -C 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg cp a aa
$ echo c >> a
$ hg qnew --git -f -e patcha
$ echo d >> a
$ hg qnew -d '0 0' -f -e patcha2
Create the reference queue:
$ hg qsave -c -e -n refqueue
copy $TESTTMP/t2/.hg/patches to $TESTTMP/t2/.hg/refqueue (glob)
$ hg up -C 1
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
Merge:
$ HGMERGE=internal:other hg qpush -a -m -n refqueue
merging with queue at: $TESTTMP/t2/.hg/refqueue (glob)
applying patcha
patching file a
Hunk #1 succeeded at 2 with fuzz 1 (offset 0 lines).
fuzz found when applying patch, stopping
patch didn't work out, merging patcha
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
0 files updated, 2 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
applying patcha2
now at: patcha2
Check patcha is still a git patch:
$ cat .hg/patches/patcha
# HG changeset patch
# Parent d3873e73d99ef67873dac33fbcc66268d5d2b6f4
diff --git a/a b/a
--- a/a
+++ b/a
@@ -1,1 +1,2 @@
-b
+a
+c
diff --git a/aa b/aa
new file mode 100644
--- /dev/null
+++ b/aa
@@ -0,0 +1,1 @@
+a
Check patcha2 is still a regular patch:
$ cat .hg/patches/patcha2
# HG changeset patch
# Parent ???????????????????????????????????????? (glob)
# Date 0 0
diff -r ???????????? -r ???????????? a (glob)
--- a/a
+++ b/a
@@ -1,2 +1,3 @@
a
c
+d
$ cd ..