Mercurial > hg
view tests/test-ssh-proto.t @ 46582:b0a3ca02d17a
copies-rust: implement PartialEqual manually
Now that we know that each (dest, rev) pair has at most a unique CopySource, we
can simplify comparison a lot.
This "simple" step buy a good share of the previous slowdown back in some case:
Repo Case Source-Rev Dest-Rev # of revisions old time new time Difference Factor time per rev
---------------------------------------------------------------------------------------------------------------------------------------------------------------
mozilla-try x00000_revs_x00000_added_x000_copies 9b2a99adc05e 8e29777b48e6 : 382065 revs, 43.304637 s, 34.443661 s, -8.860976 s, × 0.7954, 90 µs/rev
Full benchmark:
Repo Case Source-Rev Dest-Rev # of revisions old time new time Difference Factor time per rev
---------------------------------------------------------------------------------------------------------------------------------------------------------------
mercurial x_revs_x_added_0_copies ad6b123de1c7 39cfcef4f463 : 1 revs, 0.000043 s, 0.000043 s, +0.000000 s, × 1.0000, 43 µs/rev
mercurial x_revs_x_added_x_copies 2b1c78674230 0c1d10351869 : 6 revs, 0.000114 s, 0.000117 s, +0.000003 s, × 1.0263, 19 µs/rev
mercurial x000_revs_x000_added_x_copies 81f8ff2a9bf2 dd3267698d84 : 1032 revs, 0.004937 s, 0.004892 s, -0.000045 s, × 0.9909, 4 µs/rev
pypy x_revs_x_added_0_copies aed021ee8ae8 099ed31b181b : 9 revs, 0.000339 s, 0.000196 s, -0.000143 s, × 0.5782, 21 µs/rev
pypy x_revs_x000_added_0_copies 4aa4e1f8e19a 359343b9ac0e : 1 revs, 0.000049 s, 0.000050 s, +0.000001 s, × 1.0204, 50 µs/rev
pypy x_revs_x_added_x_copies ac52eb7bbbb0 72e022663155 : 7 revs, 0.000202 s, 0.000117 s, -0.000085 s, × 0.5792, 16 µs/rev
pypy x_revs_x00_added_x_copies c3b14617fbd7 ace7255d9a26 : 1 revs, 0.000409 s, 0.6f1f4a s, -0.000087 s, × 0.7873, 322 µs/rev
pypy x_revs_x000_added_x000_copies df6f7a526b60 a83dc6a2d56f : 6 revs, 0.011984 s, 0.011949 s, -0.000035 s, × 0.9971, 1991 µs/rev
pypy x000_revs_xx00_added_0_copies 89a76aede314 2f22446ff07e : 4785 revs, 0.050820 s, 0.050802 s, -0.000018 s, × 0.9996, 10 µs/rev
pypy x000_revs_x000_added_x_copies 8a3b5bfd266e 2c68e87c3efe : 6780 revs, 0.087953 s, 0.088090 s, +0.000137 s, × 1.0016, 12 µs/rev
pypy x000_revs_x000_added_x000_copies 89a76aede314 7b3dda341c84 : 5441 revs, 0.062902 s, 0.062079 s, -0.000823 s, × 0.9869, 11 µs/rev
pypy x0000_revs_x_added_0_copies d1defd0dc478 c9cb1334cc78 : 43645 revs, 0.679234 s, 0.635337 s, -0.043897 s, × 0.9354, 14 µs/rev
pypy x0000_revs_xx000_added_0_copies bf2c629d0071 4ffed77c095c : 2 revs, 0.013095 s, 0.013262 s, +0.000167 s, × 1.0128, 6631 µs/rev
pypy x0000_revs_xx000_added_x000_copies 08ea3258278e d9fa043f30c0 : 11316 revs, 0.120910 s, 0.120085 s, -0.000825 s, × 0.9932, 10 µs/rev
netbeans x_revs_x_added_0_copies fb0955ffcbcd a01e9239f9e7 : 2 revs, 0.000087 s, 0.000085 s, -0.000002 s, × 0.9770, 42 µs/rev
netbeans x_revs_x000_added_0_copies 6f360122949f 20eb231cc7d0 : 2 revs, 0.000107 s, 0.000110 s, +0.000003 s, × 1.0280, 55 µs/rev
netbeans x_revs_x_added_x_copies 1ada3faf6fb6 5a39d12eecf4 : 3 revs, 0.000186 s, 0.000177 s, -0.000009 s, × 0.9516, 59 µs/rev
netbeans x_revs_x00_added_x_copies 35be93ba1e2c 9eec5e90c05f : 9 revs, 0.000754 s, 0.000743 s, -0.000011 s, × 0.9854, 82 µs/rev
netbeans x000_revs_xx00_added_0_copies eac3045b4fdd 51d4ae7f1290 : 1421 revs, 0.010443 s, 0.010168 s, -0.000275 s, × 0.9737, 7 µs/rev
netbeans x000_revs_x000_added_x_copies e2063d266acd 6081d72689dc : 1533 revs, 0.015697 s, 0.015946 s, +0.000249 s, × 1.0159, 10 µs/rev
netbeans x000_revs_x000_added_x000_copies ff453e9fee32 411350406ec2 : 5750 revs, 0.063528 s, 0.062712 s, -0.000816 s, × 0.9872, 10 µs/rev
netbeans x0000_revs_xx000_added_x000_copies 588c2d1ced70 1aad62e59ddd : 66949 revs, 0.545515 s, 0.523832 s, -0.021683 s, × 0.9603, 7 µs/rev
mozilla-central x_revs_x_added_0_copies 3697f962bb7b 7015fcdd43a2 : 2 revs, 0.000089 s, 0.000090 s, +0.000001 s, × 1.0112, 45 µs/rev
mozilla-central x_revs_x000_added_0_copies dd390860c6c9 40d0c5bed75d : 8 revs, 0.000265 s, 0.000264 s, -0.000001 s, × 0.9962, 33 µs/rev
mozilla-central x_revs_x_added_x_copies 8d198483ae3b 14207ffc2b2f : 9 revs, 0.000381 s, 0.000187 s, -0.000194 s, × 0.4908, 20 µs/rev
mozilla-central x_revs_x00_added_x_copies 98cbc58cc6bc 446a150332c3 : 7 revs, 0.000672 s, 0.000665 s, -0.000007 s, × 0.9896, 95 µs/rev
mozilla-central x_revs_x000_added_x000_copies 3c684b4b8f68 0a5e72d1b479 : 3 revs, 0.003497 s, 0.003556 s, +0.000059 s, × 1.0169, 1185 µs/rev
mozilla-central x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 6 revs, 0.073204 s, 0.071345 s, -0.001859 s, × 0.9746, 11890 µs/rev
mozilla-central x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 1593 revs, 0.006482 s, 0.006551 s, +0.000069 s, × 1.0106, 4 µs/rev
mozilla-central x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 41 revs, 0.005066 s, 0.005078 s, +0.000012 s, × 1.0024, 123 µs/rev
mozilla-central x000_revs_x000_added_x000_copies 7c97034feb78 4407bd0c6330 : 7839 revs, 0.065707 s, 0.065823 s, +0.000116 s, × 1.0018, 8 µs/rev
mozilla-central x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 615 revs, 0.026800 s, 0.027050 s, +0.000250 s, × 1.0093, 43 µs/rev
mozilla-central x0000_revs_xx000_added_x000_copies f78c615a656c 96a38b690156 : 30263 revs, 0.203856 s, 0.202443 s, -0.001413 s, × 0.9931, 6 µs/rev
mozilla-central x00000_revs_x0000_added_x0000_copies 6832ae71433c 4c222a1d9a00 : 153721 revs, 1.293394 s, 1.261583 s, -0.031811 s, × 0.9754, 8 µs/rev
mozilla-central x00000_revs_x00000_added_x000_copies 76caed42cf7c 1daa622bbe42 : 204976 revs, 1.698239 s, 1.643869 s, -0.054370 s, × 0.9680, 8 µs/rev
mozilla-try x_revs_x_added_0_copies aaf6dde0deb8 9790f499805a : 2 revs, 0.000875 s, 0.000868 s, -0.000007 s, × 0.9920, 434 µs/rev
mozilla-try x_revs_x000_added_0_copies d8d0222927b4 5bb8ce8c7450 : 2 revs, 0.000891 s, 0.000887 s, -0.000004 s, × 0.9955, 443 µs/rev
mozilla-try x_revs_x_added_x_copies 092fcca11bdb 936255a0384a : 4 revs, 0.000292 s, 0.000168 s, -0.000124 s, × 0.5753, 42 µs/rev
mozilla-try x_revs_x00_added_x_copies b53d2fadbdb5 017afae788ec : 2 revs, 0.003939 s, 0.001160 s, -0.002779 s, × 0.2945, 580 µs/rev
mozilla-try x_revs_x000_added_x000_copies 20408ad61ce5 6f0ee96e21ad : 1 revs, 0.033027 s, 0.033016 s, -0.000011 s, × 0.9997, 33016 µs/rev
mozilla-try x_revs_x0000_added_x0000_copies effb563bb7e5 c07a39dc4e80 : 6 revs, 0.073703 s, 0.073312 s, -0.39ae31 s, × 0.9947, 12218 µs/rev
mozilla-try x000_revs_xx00_added_0_copies 6100d773079a 04a55431795e : 1593 revs, 0.006469 s, 0.006485 s, +0.000016 s, × 1.0025, 4 µs/rev
mozilla-try x000_revs_x000_added_x_copies 9f17a6fc04f9 2d37b966abed : 41 revs, 0.005278 s, 0.005494 s, +0.000216 s, × 1.0409, 134 µs/rev
mozilla-try x000_revs_x000_added_x000_copies 1346fd0130e4 4c65cbdabc1f : 6657 revs, 0.064995 s, 0.064879 s, -0.000116 s, × 0.9982, 9 µs/rev
mozilla-try x0000_revs_x_added_0_copies 63519bfd42ee a36a2a865d92 : 40314 revs, 0.301041 s, 0.301469 s, +0.000428 s, × 1.0014, 7 µs/rev
mozilla-try x0000_revs_x_added_x_copies 9fe69ff0762d bcabf2a78927 : 38690 revs, 0.285575 s, 0.297113 s, +0.011538 s, × 1.0404, 7 µs/rev
mozilla-try x0000_revs_xx000_added_x_copies 156f6e2674f2 4d0f2c178e66 : 8598 revs, 0.085597 s, 0.085890 s, +0.000293 s, × 1.0034, 9 µs/rev
mozilla-try x0000_revs_xx000_added_0_copies 9eec5917337d 67118cc6dcad : 615 revs, 0.027118 s, 0.027718 s, +0.000600 s, × 1.0221, 45 µs/rev
mozilla-try x0000_revs_xx000_added_x000_copies 89294cd501d9 7ccb2fc7ccb5 : 97052 revs, 2.119204 s, 2.048949 s, -0.070255 s, × 0.9668, 21 µs/rev
mozilla-try x0000_revs_x0000_added_x0000_copies e928c65095ed e951f4ad123a : 52031 revs, 0.701479 s, 0.685924 s, -0.015555 s, × 0.9778, 13 µs/rev
mozilla-try x00000_revs_x_added_0_copies 6a320851d377 1ebb79acd503 : 363753 revs, 4.482399 s, 4.482891 s, +0.000492 s, × 1.0001, 12 µs/rev
mozilla-try x00000_revs_x00000_added_0_copies dc8a3ca7010e d16fde900c9c : 34414 revs, 0.574082 s, 0.577633 s, +0.003551 s, × 1.0062, 16 µs/rev
mozilla-try x00000_revs_x_added_x_copies 5173c4b6f97c 95d83ee7242d : 362229 revs, 4.480366 s, 4.397816 s, -0.082550 s, × 0.9816, 12 µs/rev
mozilla-try x00000_revs_x000_added_x_copies 9126823d0e9c ca82787bb23c : 359344 revs, 4.369070 s, 4.370538 s, +0.001468 s, × 1.0003, 12 µs/rev
mozilla-try x00000_revs_x0000_added_x0000_copies 8d3fafa80d4b eb884023b810 : 192665 revs, 1.592506 s, 1.570439 s, -0.022067 s, × 0.9861, 8 µs/rev
mozilla-try x00000_revs_x00000_added_x0000_copies 1b661134e2ca 1ae03d022d6d : 228985 revs, 87.824489 s, 88.388512 s, +0.564023 s, × 1.0064, 386 µs/rev
mozilla-try x00000_revs_x00000_added_x000_copies 9b2a99adc05e 8e29777b48e6 : 382065 revs, 43.304637 s, 34.443661 s, -8.860976 s, × 0.7954, 90 µs/rev
private : 459513 revs, 33.853687 s, 27.370148 s, -6.483539 s, × 0.8085, 59 µs/rev
Differential Revision: https://phab.mercurial-scm.org/D9653
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 16 Dec 2020 11:11:05 +0100 |
parents | 95c4cca641f6 |
children | 7015b0232c5e |
line wrap: on
line source
#require no-chg $ cat > hgrc-sshv2 << EOF > %include $HGRCPATH > [experimental] > sshpeer.advertise-v2 = true > sshserver.support-v2 = true > EOF Helper function to run protocol tests against multiple protocol versions. This is easier than using #testcases because managing differences between protocols with inline conditional output is hard to read. $ debugwireproto() { > commands=`cat -` > echo 'testing ssh1' > echo "${commands}" | hg --verbose debugwireproto --localssh > echo "" > echo 'testing ssh2' > echo "${commands}" | HGRCPATH=$TESTTMP/hgrc-sshv2 hg --verbose debugwireproto --localssh > } $ cat >> $HGRCPATH << EOF > [ui] > ssh = "$PYTHON" "$TESTDIR/dummyssh" > [devel] > debug.peer-request = true > [extensions] > sshprotoext = $TESTDIR/sshprotoext.py > EOF $ hg init server $ cd server $ echo 0 > foo $ hg -q add foo $ hg commit -m initial A no-op connection performs a handshake $ hg debugwireproto --localssh << EOF > EOF creating ssh peer from handshake results Raw peers don't perform any activity $ hg debugwireproto --localssh --peer raw << EOF > EOF using raw connection to peer $ hg debugwireproto --localssh --peer ssh1 << EOF > EOF creating ssh peer for wire protocol version 1 $ hg debugwireproto --localssh --peer ssh2 << EOF > EOF creating ssh peer for wire protocol version 2 Test a normal behaving server, for sanity $ cd .. $ hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: 463 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash remote: 1 devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes Server should answer the "hello" command in isolation $ hg -R server debugwireproto --localssh --peer raw << EOF > raw > hello\n > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n `hg debugserve --sshstdio` works $ cd server $ hg debugserve --sshstdio << EOF > hello > EOF 463 capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash I/O logging works $ hg debugserve --sshstdio --logiofd 1 << EOF > hello > EOF e> flush() -> None o> write(4) -> 4: o> 463\n o> write(463) -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n 463 capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> flush() -> None $ hg debugserve --sshstdio --logiofile $TESTTMP/io << EOF > hello > EOF 463 capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash $ cat $TESTTMP/io e> flush() -> None o> write(4) -> 4: o> 463\n o> write(463) -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> flush() -> None $ cd .. >=0.9.1 clients send a "hello" + "between" for the null range as part of handshake. Server should reply with capabilities and should send "1\n\n" as a successful reply with empty response to the "between". $ hg -R server debugwireproto --localssh --peer raw << EOF > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n SSH banner is not printed by default, ignored by clients $ SSHSERVERMODE=banner hg debugpeer ssh://user@dummy/server url: ssh://user@dummy/server local: no pushable: yes --debug will print the banner $ SSHSERVERMODE=banner hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: banner: line 0 remote: banner: line 1 remote: banner: line 2 remote: banner: line 3 remote: banner: line 4 remote: banner: line 5 remote: banner: line 6 remote: banner: line 7 remote: banner: line 8 remote: banner: line 9 remote: 463 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash remote: 1 devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes And test the banner with the raw protocol $ SSHSERVERMODE=banner hg -R server debugwireproto --localssh --peer raw << EOF > raw > hello\n > readline > readline > readline > readline > readline > readline > readline > readline > readline > readline > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> hello\n o> readline() -> 15: o> banner: line 0\n o> readline() -> 15: o> banner: line 1\n o> readline() -> 15: o> banner: line 2\n o> readline() -> 15: o> banner: line 3\n o> readline() -> 15: o> banner: line 4\n o> readline() -> 15: o> banner: line 5\n o> readline() -> 15: o> banner: line 6\n o> readline() -> 15: o> banner: line 7\n o> readline() -> 15: o> banner: line 8\n o> readline() -> 15: o> banner: line 9\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n Connecting to a <0.9.1 server that doesn't support the hello command. The client should refuse, as we dropped support for connecting to such servers. $ SSHSERVERMODE=no-hello hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: 0 remote: 1 abort: no suitable response from remote hg [255] Sending an unknown command to the server results in an empty response to that command $ hg -R server debugwireproto --localssh --peer raw << EOF > raw > pre-hello\n > readline > raw > hello\n > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(10) -> 10: i> pre-hello\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n $ hg --config sshpeer.mode=extra-handshake-commands --config sshpeer.handshake-mode=pre-no-args --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) sending no-args command devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: 0 remote: 463 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash remote: 1 devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes Send multiple unknown commands before hello $ hg -R server debugwireproto --localssh --peer raw << EOF > raw > unknown1\n > readline > raw > unknown2\n > readline > raw > unknown3\n > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(9) -> 9: i> unknown1\n o> readline() -> 2: o> 0\n i> write(9) -> 9: i> unknown2\n o> readline() -> 2: o> 0\n i> write(9) -> 9: i> unknown3\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n $ hg --config sshpeer.mode=extra-handshake-commands --config sshpeer.handshake-mode=pre-multiple-no-args --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) sending unknown1 command sending unknown2 command sending unknown3 command devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: 0 remote: 0 remote: 0 remote: 463 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash remote: 1 devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes Send an unknown command before hello that has arguments $ cd server $ hg debugwireproto --localssh --peer raw << EOF > raw > with-args\n > foo 13\n > value for foo\n > bar 13\n > value for bar\n > readline > readline > readline > readline > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(52) -> 52: i> with-args\n i> foo 13\n i> value for foo\n i> bar 13\n i> value for bar\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n Send an unknown command having an argument that looks numeric $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown\n > foo 1\n > 0\n > readline > readline > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(16) -> 16: i> unknown\n i> foo 1\n i> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown\n > foo 1\n > 1\n > readline > readline > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(16) -> 16: i> unknown\n i> foo 1\n i> 1\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n When sending a dict argument value, it is serialized to "<arg> <item count>" followed by "<key> <len>\n<value>" for each item in the dict. Dictionary value for unknown command $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown\n > dict 3\n > key1 3\n > foo\n > key2 3\n > bar\n > key3 3\n > baz\n > readline > readline > readline > readline > readline > readline > readline > readline > raw > hello\n > readline > readline > EOF using raw connection to peer i> write(48) -> 48: i> unknown\n i> dict 3\n i> key1 3\n i> foo\n i> key2 3\n i> bar\n i> key3 3\n i> baz\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n Incomplete dictionary send $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown\n > dict 3\n > key1 3\n > foo\n > readline > readline > readline > readline > EOF using raw connection to peer i> write(26) -> 26: i> unknown\n i> dict 3\n i> key1 3\n i> foo\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n Incomplete value send $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown\n > dict 3\n > key1 3\n > fo > readline > readline > readline > EOF using raw connection to peer i> write(24) -> 24: i> unknown\n i> dict 3\n i> key1 3\n i> fo o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n Send a command line with spaces $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown withspace\n > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(18) -> 18: i> unknown withspace\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown with multiple spaces\n > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > EOF using raw connection to peer i> write(29) -> 29: i> unknown with multiple spaces\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n $ hg debugwireproto --localssh --peer raw << EOF > raw > unknown with spaces\n > key 10\n > some value\n > readline > readline > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(38) -> 38: i> unknown with spaces\n i> key 10\n i> some value\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n Send an unknown command after the "between" $ hg debugwireproto --localssh --peer raw << EOF > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(105) -> 105: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n And one with arguments $ hg debugwireproto --localssh --peer raw << EOF > raw > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > readline > raw > unknown\n > foo 5\n > \nvalue\n > bar 3\n > baz\n > readline > readline > readline > EOF using raw connection to peer i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n i> write(31) -> 31: i> unknown\n i> foo 5\n i> \n i> value\n i> bar 3\n i> baz\n o> readline() -> 2: o> 0\n o> readline() -> 2: o> 0\n o> readline() -> 0: Send a valid command before the handshake $ hg debugwireproto --localssh --peer raw << EOF > raw > heads\n > readline > raw > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> heads\n o> readline() -> 3: o> 41\n i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 41: o> 68986213bd4485ea51533535e3fc9e78007a711f\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n And a variation that doesn't send the between command $ hg debugwireproto --localssh --peer raw << EOF > raw > heads\n > readline > raw > hello\n > readline > readline > EOF using raw connection to peer i> write(6) -> 6: i> heads\n o> readline() -> 3: o> 41\n i> write(6) -> 6: i> hello\n o> readline() -> 41: o> 68986213bd4485ea51533535e3fc9e78007a711f\n o> readline() -> 4: o> 463\n Send an upgrade request to a server that doesn't support that command $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade 2e82ab3f-9ce3-4b4e-8f8c-6fd1c0e9e23a proto=irrelevant1%2Cirrelevant2\n > readline > raw > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > readline > EOF using raw connection to peer i> write(77) -> 77: i> upgrade 2e82ab3f-9ce3-4b4e-8f8c-6fd1c0e9e23a proto=irrelevant1%2Cirrelevant2\n o> readline() -> 2: o> 0\n i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n $ cd .. $ hg --config experimental.sshpeer.advertise-v2=true --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) sending upgrade request: * proto=exp-ssh-v2-0003 (glob) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command remote: 0 remote: 463 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash remote: 1 devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes Enable version 2 support on server. We need to do this in hgrc because we can't use --config with `hg serve --stdio`. $ cat >> server/.hg/hgrc << EOF > [experimental] > sshserver.support-v2 = true > EOF Send an upgrade request to a server that supports upgrade $ cd server $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade this-is-some-token proto=exp-ssh-v2-0003\n > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > EOF using raw connection to peer i> write(153) -> 153: i> upgrade this-is-some-token proto=exp-ssh-v2-0003\n i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 44: o> upgraded this-is-some-token exp-ssh-v2-0003\n o> readline() -> 4: o> 462\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n $ cd .. $ hg --config experimental.sshpeer.advertise-v2=true --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) sending upgrade request: * proto=exp-ssh-v2-0003 (glob) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command protocol upgraded to exp-ssh-v2-0003 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command url: ssh://user@dummy/server local: no pushable: yes Verify the peer has capabilities $ hg --config experimental.sshpeer.advertise-v2=true --debug debugcapabilities ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !) running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !) sending upgrade request: * proto=exp-ssh-v2-0003 (glob) devel-peer-request: hello+between devel-peer-request: pairs: 81 bytes sending hello command sending between command protocol upgraded to exp-ssh-v2-0003 remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash devel-peer-request: protocaps devel-peer-request: caps: * bytes (glob) sending protocaps command Main capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash Bundle2 capabilities: HG20 bookmarks changegroup 01 02 checkheads related digests md5 sha1 sha512 error abort unsupportedcontent pushraced pushkey hgtagsfnodes listkeys phases heads pushkey remote-changegroup http https rev-branch-cache stream v2 Command after upgrade to version 2 is processed $ cd server $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade this-is-some-token proto=exp-ssh-v2-0003\n > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > raw > hello\n > readline > readline > EOF using raw connection to peer i> write(153) -> 153: i> upgrade this-is-some-token proto=exp-ssh-v2-0003\n i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 44: o> upgraded this-is-some-token exp-ssh-v2-0003\n o> readline() -> 4: o> 462\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 447\n o> readline() -> 447: o> capabilities: branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n Multiple upgrades is not allowed $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade this-is-some-token proto=exp-ssh-v2-0003\n > hello\n > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > readline > raw > upgrade another-token proto=irrelevant\n > hello\n > readline > readavailable > EOF using raw connection to peer i> write(153) -> 153: i> upgrade this-is-some-token proto=exp-ssh-v2-0003\n i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 44: o> upgraded this-is-some-token exp-ssh-v2-0003\n o> readline() -> 4: o> 462\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(45) -> 45: i> upgrade another-token proto=irrelevant\n i> hello\n o> readline() -> 1: o> \n e> read(-1) -> 42: e> cannot upgrade protocols multiple times\n e> -\n Malformed upgrade request line (not exactly 3 space delimited tokens) $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade\n > readline > EOF using raw connection to peer i> write(8) -> 8: i> upgrade\n o> readline() -> 2: o> 0\n $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade token\n > readline > EOF using raw connection to peer i> write(14) -> 14: i> upgrade token\n o> readline() -> 2: o> 0\n $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade token foo=bar extra-token\n > readline > EOF using raw connection to peer i> write(34) -> 34: i> upgrade token foo=bar extra-token\n o> readline() -> 2: o> 0\n Upgrade request to unsupported protocol is ignored $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade this-is-some-token proto=unknown1,unknown2\n > readline > raw > hello\n > readline > readline > raw > between\n > pairs 81\n > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > readline > readline > EOF using raw connection to peer i> write(51) -> 51: i> upgrade this-is-some-token proto=unknown1,unknown2\n o> readline() -> 2: o> 0\n i> write(6) -> 6: i> hello\n o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n i> write(98) -> 98: i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n Upgrade request must be followed by hello + between $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade token proto=exp-ssh-v2-0003\n > invalid\n > readline > readavailable > EOF using raw connection to peer i> write(44) -> 44: i> upgrade token proto=exp-ssh-v2-0003\n i> invalid\n o> readline() -> 1: o> \n e> read(-1) -> 46: e> malformed handshake protocol: missing hello\n e> -\n $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade token proto=exp-ssh-v2-0003\n > hello\n > invalid\n > readline > readavailable > EOF using raw connection to peer i> write(50) -> 50: i> upgrade token proto=exp-ssh-v2-0003\n i> hello\n i> invalid\n o> readline() -> 1: o> \n e> read(-1) -> 48: e> malformed handshake protocol: missing between\n e> -\n $ hg debugwireproto --localssh --peer raw << EOF > raw > upgrade token proto=exp-ssh-v2-0003\n > hello\n > between\n > invalid\n > readline > readavailable > EOF using raw connection to peer i> write(58) -> 58: i> upgrade token proto=exp-ssh-v2-0003\n i> hello\n i> between\n i> invalid\n o> readline() -> 1: o> \n e> read(-1) -> 49: e> malformed handshake protocol: missing pairs 81\n e> -\n Legacy commands are not exposed to version 2 of protocol TODO re-enable these once we're back to actually using v2 commands $ hg --config experimental.sshpeer.advertise-v2=true debugwireproto --localssh << EOF > command branches > nodes 0000000000000000000000000000000000000000 > EOF creating ssh peer from handshake results sending branches command response: $ hg --config experimental.sshpeer.advertise-v2=true debugwireproto --localssh << EOF > command changegroup > roots 0000000000000000000000000000000000000000 > EOF creating ssh peer from handshake results sending changegroup command response: $ hg --config experimental.sshpeer.advertise-v2=true debugwireproto --localssh << EOF > command changegroupsubset > bases 0000000000000000000000000000000000000000 > heads 0000000000000000000000000000000000000000 > EOF creating ssh peer from handshake results sending changegroupsubset command response: $ cd .. Test listkeys for listing namespaces $ hg init empty $ cd empty $ debugwireproto << EOF > command listkeys > namespace namespaces > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(13) -> 13: i> namespace 10\n i> write(10) -> 10: namespaces i> flush() -> None o> bufferedreadline() -> 3: o> 30\n o> bufferedread(30) -> 30: o> bookmarks\t\n o> namespaces\t\n o> phases\t response: { b'bookmarks': b'', b'namespaces': b'', b'phases': b'' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(13) -> 13: i> namespace 10\n i> write(10) -> 10: namespaces i> flush() -> None o> bufferedreadline() -> 3: o> 30\n o> bufferedread(30) -> 30: o> bookmarks\t\n o> namespaces\t\n o> phases\t response: { b'bookmarks': b'', b'namespaces': b'', b'phases': b'' } $ cd .. Test listkeys for bookmarks $ hg init bookmarkrepo $ cd bookmarkrepo $ echo 0 > foo $ hg add foo $ hg -q commit -m initial $ echo 1 > foo $ hg commit -m second With no bookmarks set $ debugwireproto << EOF > command listkeys > namespace bookmarks > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 2: o> 0\n response: {} testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 2: o> 0\n response: {} With a single bookmark set $ hg book -r 0 bookA $ debugwireproto << EOF > command listkeys > namespace bookmarks > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 3: o> 46\n o> bufferedread(46) -> 46: bookA\t68986213bd4485ea51533535e3fc9e78007a711f response: { b'bookA': b'68986213bd4485ea51533535e3fc9e78007a711f' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 3: o> 46\n o> bufferedread(46) -> 46: bookA\t68986213bd4485ea51533535e3fc9e78007a711f response: { b'bookA': b'68986213bd4485ea51533535e3fc9e78007a711f' } With multiple bookmarks set $ hg book -r 1 bookB $ debugwireproto << EOF > command listkeys > namespace bookmarks > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 3: o> 93\n o> bufferedread(93) -> 93: o> bookA\t68986213bd4485ea51533535e3fc9e78007a711f\n o> bookB\t1880f3755e2e52e3199e0ee5638128b08642f34d response: { b'bookA': b'68986213bd4485ea51533535e3fc9e78007a711f', b'bookB': b'1880f3755e2e52e3199e0ee5638128b08642f34d' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> flush() -> None o> bufferedreadline() -> 3: o> 93\n o> bufferedread(93) -> 93: o> bookA\t68986213bd4485ea51533535e3fc9e78007a711f\n o> bookB\t1880f3755e2e52e3199e0ee5638128b08642f34d response: { b'bookA': b'68986213bd4485ea51533535e3fc9e78007a711f', b'bookB': b'1880f3755e2e52e3199e0ee5638128b08642f34d' } Test pushkey for bookmarks $ debugwireproto << EOF > command pushkey > namespace bookmarks > key remote > old > new 68986213bd4485ea51533535e3fc9e78007a711f > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending pushkey command i> write(8) -> 8: i> pushkey\n i> write(6) -> 6: i> key 6\n i> write(6) -> 6: remote i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> write(7) -> 7: i> new 40\n i> write(40) -> 40: 68986213bd4485ea51533535e3fc9e78007a711f i> write(6) -> 6: i> old 0\n i> flush() -> None o> bufferedreadline() -> 2: o> 2\n o> bufferedread(2) -> 2: o> 1\n response: True testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending pushkey command i> write(8) -> 8: i> pushkey\n i> write(6) -> 6: i> key 6\n i> write(6) -> 6: remote i> write(12) -> 12: i> namespace 9\n i> write(9) -> 9: bookmarks i> write(7) -> 7: i> new 40\n i> write(40) -> 40: 68986213bd4485ea51533535e3fc9e78007a711f i> write(6) -> 6: i> old 0\n i> flush() -> None o> bufferedreadline() -> 2: o> 2\n o> bufferedread(2) -> 2: o> 1\n response: True $ hg bookmarks bookA 0:68986213bd44 bookB 1:1880f3755e2e remote 0:68986213bd44 $ cd .. Test listkeys for phases $ hg init phasesrepo $ cd phasesrepo Phases on empty repo $ debugwireproto << EOF > command listkeys > namespace phases > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 15\n o> bufferedread(15) -> 15: publishing\tTrue response: { b'publishing': b'True' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 15\n o> bufferedread(15) -> 15: publishing\tTrue response: { b'publishing': b'True' } Create some commits $ echo 0 > foo $ hg add foo $ hg -q commit -m initial $ hg phase --public $ echo 1 > foo $ hg commit -m 'head 1 commit 1' $ echo 2 > foo $ hg commit -m 'head 1 commit 2' $ hg -q up 0 $ echo 1a > foo $ hg commit -m 'head 2 commit 1' created new head $ echo 2a > foo $ hg commit -m 'head 2 commit 2' Two draft heads $ debugwireproto << EOF > command listkeys > namespace phases > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 4: o> 101\n o> bufferedread(101) -> 101: o> 20b8a89289d80036e6c4e87c2083e3bea1586637\t1\n o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n o> publishing\tTrue response: { b'20b8a89289d80036e6c4e87c2083e3bea1586637': b'1', b'c4750011d906c18ea2f0527419cbc1a544435150': b'1', b'publishing': b'True' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 4: o> 101\n o> bufferedread(101) -> 101: o> 20b8a89289d80036e6c4e87c2083e3bea1586637\t1\n o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n o> publishing\tTrue response: { b'20b8a89289d80036e6c4e87c2083e3bea1586637': b'1', b'c4750011d906c18ea2f0527419cbc1a544435150': b'1', b'publishing': b'True' } Single draft head $ hg phase --public -r 2 $ debugwireproto << EOF > command listkeys > namespace phases > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 58\n o> bufferedread(58) -> 58: o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n o> publishing\tTrue response: { b'c4750011d906c18ea2f0527419cbc1a544435150': b'1', b'publishing': b'True' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 58\n o> bufferedread(58) -> 58: o> c4750011d906c18ea2f0527419cbc1a544435150\t1\n o> publishing\tTrue response: { b'c4750011d906c18ea2f0527419cbc1a544435150': b'1', b'publishing': b'True' } All public heads $ hg phase --public -r 4 $ debugwireproto << EOF > command listkeys > namespace phases > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 15\n o> bufferedread(15) -> 15: publishing\tTrue response: { b'publishing': b'True' } testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending listkeys command i> write(9) -> 9: i> listkeys\n i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> flush() -> None o> bufferedreadline() -> 3: o> 15\n o> bufferedread(15) -> 15: publishing\tTrue response: { b'publishing': b'True' } Setting public phase via pushkey $ hg phase --draft --force -r . $ debugwireproto << EOF > command pushkey > namespace phases > key 7127240a084fd9dc86fe8d1f98e26229161ec82b > old 1 > new 0 > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending pushkey command i> write(8) -> 8: i> pushkey\n i> write(7) -> 7: i> key 40\n i> write(40) -> 40: 7127240a084fd9dc86fe8d1f98e26229161ec82b i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> write(6) -> 6: i> new 1\n i> write(1) -> 1: 0 i> write(6) -> 6: i> old 1\n i> write(1) -> 1: 1 i> flush() -> None o> bufferedreadline() -> 2: o> 2\n o> bufferedread(2) -> 2: o> 1\n response: True testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending pushkey command i> write(8) -> 8: i> pushkey\n i> write(7) -> 7: i> key 40\n i> write(40) -> 40: 7127240a084fd9dc86fe8d1f98e26229161ec82b i> write(12) -> 12: i> namespace 6\n i> write(6) -> 6: phases i> write(6) -> 6: i> new 1\n i> write(1) -> 1: 0 i> write(6) -> 6: i> old 1\n i> write(1) -> 1: 1 i> flush() -> None o> bufferedreadline() -> 2: o> 2\n o> bufferedread(2) -> 2: o> 1\n response: True $ hg phase . 4: public $ cd .. Test batching of requests $ hg init batching $ cd batching $ echo 0 > foo $ hg add foo $ hg -q commit -m initial $ hg phase --public $ echo 1 > foo $ hg commit -m 'commit 1' $ hg -q up 0 $ echo 2 > foo $ hg commit -m 'commit 2' created new head $ hg book -r 1 bookA $ hg book -r 2 bookB $ debugwireproto << EOF > batchbegin > command heads > command listkeys > namespace bookmarks > command listkeys > namespace phases > batchsubmit > EOF testing ssh1 creating ssh peer from handshake results i> write(104) -> 104: i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 4: o> 463\n o> readline() -> 463: o> capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash\n o> readline() -> 2: o> 1\n o> readline() -> 1: o> \n sending batch with 3 sub-commands i> write(6) -> 6: i> batch\n i> write(4) -> 4: i> * 0\n i> write(8) -> 8: i> cmds 61\n i> write(61) -> 61: heads ;listkeys namespace=bookmarks;listkeys namespace=phases i> flush() -> None o> bufferedreadline() -> 4: o> 278\n o> bufferedread(278) -> 278: o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n o> ;bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n o> bookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\n o> bfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\n o> publishing\tTrue response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n response #1: bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\npublishing\tTrue testing ssh2 creating ssh peer from handshake results i> write(171) -> 171: i> upgrade * proto=exp-ssh-v2-0003\n (glob) i> hello\n i> between\n i> pairs 81\n i> 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 i> flush() -> None o> readline() -> 62: o> upgraded * exp-ssh-v2-0003\n (glob) o> readline() -> 4: o> 462\n o> read(462) -> 462: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1,sparserevlog unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash o> read(1) -> 1: o> \n sending batch with 3 sub-commands i> write(6) -> 6: i> batch\n i> write(4) -> 4: i> * 0\n i> write(8) -> 8: i> cmds 61\n i> write(61) -> 61: heads ;listkeys namespace=bookmarks;listkeys namespace=phases i> flush() -> None o> bufferedreadline() -> 4: o> 278\n o> bufferedread(278) -> 278: o> bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n o> ;bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n o> bookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6;4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\n o> bfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\n o> publishing\tTrue response #0: bfebe6bd38eebc6f8202e419c1171268987ea6a6 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\n response #1: bookA\t4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\nbookB\tbfebe6bd38eebc6f8202e419c1171268987ea6a6 response #2: 4ee3fcef1c800fa2bf23e20af7c83ff111d9c7ab\t1\nbfebe6bd38eebc6f8202e419c1171268987ea6a6\t1\npublishing\tTrue