$ 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 $ cd .. Test a normal behaving server, for sanity $ hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) devel-peer-request: hello sending hello command devel-peer-request: between devel-peer-request: pairs: 81 bytes sending between command remote: 384 remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN remote: 1 url: ssh://user@dummy/server local: no pushable: yes Server should answer the "hello" command in isolation $ hg -R server serve --stdio << EOF > hello > EOF 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN >=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 serve --stdio << EOF > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 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) devel-peer-request: hello sending hello command devel-peer-request: between devel-peer-request: pairs: 81 bytes 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: 384 remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN remote: 1 url: ssh://user@dummy/server local: no pushable: yes And test the banner with the raw protocol $ SSHSERVERMODE=banner hg -R server serve --stdio << EOF > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF banner: line 0 banner: line 1 banner: line 2 banner: line 3 banner: line 4 banner: line 5 banner: line 6 banner: line 7 banner: line 8 banner: line 9 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 Connecting to a <0.9.1 server that doesn't support the hello command $ SSHSERVERMODE=no-hello hg --debug debugpeer ssh://user@dummy/server running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) devel-peer-request: hello sending hello command devel-peer-request: between devel-peer-request: pairs: 81 bytes sending between command remote: 0 remote: 1 url: ssh://user@dummy/server local: no pushable: yes The client should interpret this as no capabilities $ SSHSERVERMODE=no-hello hg debugcapabilities ssh://user@dummy/server Main capabilities: Sending an unknown command to the server results in an empty response to that command $ hg -R server serve --stdio << EOF > pre-hello > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 $ 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) devel-peer-request: no-args sending no-args command devel-peer-request: hello sending hello command devel-peer-request: between devel-peer-request: pairs: 81 bytes sending between command remote: 0 remote: 384 remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN remote: 1 url: ssh://user@dummy/server local: no pushable: yes Send multiple unknown commands before hello $ hg -R server serve --stdio << EOF > unknown1 > unknown2 > unknown3 > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 $ 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) devel-peer-request: unknown1 sending unknown1 command devel-peer-request: unknown2 sending unknown2 command devel-peer-request: unknown3 sending unknown3 command devel-peer-request: hello sending hello command devel-peer-request: between devel-peer-request: pairs: 81 bytes sending between command remote: 0 remote: 0 remote: 0 remote: 384 remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN remote: 1 url: ssh://user@dummy/server local: no pushable: yes Send an unknown command before hello that has arguments $ hg -R server serve --stdio << EOF > with-args > foo 13 > value for foo > bar 13 > value for bar > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 0 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 Send an unknown command having an argument that looks numeric $ hg -R server serve --stdio << EOF > unknown > foo 1 > 0 > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 $ hg -R server serve --stdio << EOF > unknown > foo 1 > 1 > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 When sending a dict argument value, it is serialized to " " followed by " \n" for each item in the dict. Dictionary value for unknown command $ hg -R server serve --stdio << EOF > unknown > dict 3 > key1 3 > foo > key2 3 > bar > key3 3 > baz > hello > EOF 0 0 0 0 0 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN Incomplete dictionary send $ hg -R server serve --stdio << EOF > unknown > dict 3 > key1 3 > foo > EOF 0 0 0 0 Incomplete value send $ hg -R server serve --stdio << EOF > unknown > dict 3 > key1 3 > fo > EOF 0 0 0 0 Send a command line with spaces $ hg -R server serve --stdio << EOF > unknown withspace > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 $ hg -R server serve --stdio << EOF > unknown with multiple spaces > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 $ hg -R server serve --stdio << EOF > unknown with spaces > key 10 > some value > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000 > EOF 0 0 0 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 Send an unknown command after the "between" $ hg -R server serve --stdio << EOF > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown > EOF 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 0 And one with arguments $ hg -R server serve --stdio << EOF > hello > between > pairs 81 > 0000000000000000000000000000000000000000-0000000000000000000000000000000000000000unknown > foo 5 > value > bar 3 > baz > EOF 384 capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS_SERVER$ unbundle=HG10GZ,HG10BZ,HG10UN 1 0 0 0 0 0