mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
f13c34a644
Recently hg-ssh was changed to block writes via in-memory hook configuration instead of by passing config hooks, and dispatch.py blocks any invocation of hg serve --stdio that has options passed. We have infrastructure that sets up read only serve processes without using hg-ssh, and it was broken by this change. Let's add a --read-only option to hg serve so non-hg-ssh solutions can still launch hg in read-only mode. This makes it also work with non-stdio serve processes as well. (grafted from 7a0ed9aad8526f689343a5a02aa4a66e5f3be1f2) (grafted from bf33f750447d8b0dfeae2a311e1d1eb93e19d6a0) (grafted from 9ada6a6e4ac2a92325592cd58edd9160e17c9e31) (grafted from 50e676e99c3b7cc929ceaaebbd3c684a8a58f9d8) (grafted from 01833a49fa4dca204dc0e606f21279530925307c) (grafted from 301af2e1a42fe912acf90ae9a87ca6a20ce5cd5d) (grafted from 6ae2eaad3edbfdfb04ac5880a86341e69980529c) (grafted from fcdedd417b29d28797840fc2393e0ff846fa54c8) (grafted from ddda3705adfb2ac103f506d694d2b30028dfaca9) (grafted from 138e3cf3bc394c4ff507341a390e1876c7104042) (grafted from f8073d595e87086213525dbb642962b84158ee9a) (grafted from 96bac04dc722030250a53616f0fb55125829f25e) (grafted from 2aeed48cc3b3324b564343d8515aed1ecec69b14) (grafted from 4fb2e02a273c868febdae9530b0a07a53a0e92a7) (grafted from c57b28835f0b880c075d5b8aa99ddb9da54b21b1) (grafted from 35fd78b021bec96db63e8dd99f98efc3b2342380) (grafted from 9ac14f96c9a82068f07a709374f359283c206791) (grafted from 4b64c191a9aacd52ea58ae8ec943605667759398) (grafted from 1db390a79e32db12dde7a225e26b86ed245f9473) (grafted from 9a999ed1ce50af8e5fa03dc270488c37304d8c94) (grafted from b6791f2eb83f176192c9df50c736bc4c54fab5a6) (grafted from 4b6e87c5be38d9971399e4ad989e4261f283b93a) (grafted from ae660c075b4af0849d1ff5d36404ef66aeea9933) (grafted from ff0f3bf0834b38a527654495369cd538ca8744f4) (grafted from bff8177767c9023295ff93bc520114bb909952a8) (grafted from 05a833e4071b9da7b447669f6bd8a3f62c1d3c27) (grafted from be8ab299731fb8295efbe10a014798c7a177d4a0) (grafted from beec2bc2ebd9eaf7093bba5fca8fef07c669d970) (grafted from 03d88ba3cd8795d17a99dc1b50ac55e1937d38e1) (grafted from 92a33bc0d275a96c61553f8bccefcd32f1360931) (grafted from 3d37833f54e37356f3e32db2ad8fb2ffe4fa14f2) (grafted from 77fa3393787a9410e14afc26465abb5561253075) (grafted from 9d908f86cc7986c167cef5cdccaabb565fd2bc04) (grafted from 0dbc2023c42f72aea6b608e5111725163dcbb64b) (grafted from 3acf4e9bb718617efaf31abcba583b9b7be2559d) (grafted from c671696a06e418f5f040427efb3e51fe4c9fa6cd) (grafted from 309f11e682eb3c6fa497bf767cbcbef3b0dbaf4b) (grafted from 4f828ef4b70a6a16fe747d5f6393042bff204b5e) (grafted from 71193e84a71d029dedc744882978285cbe5722e6) (grafted from 2929832c61c9727bd884f94da5afa29e80334a96) (grafted from 2ff8a9f1761f82ffa8ebd2a96d86f7de7c712d9c) (grafted from b438cb1e6cff36e7e197da7669def8a5e528053c) (grafted from a9ed103481b779af9e160d2b81a9bfe81cc7d173) (grafted from d139e95d22dc811002dafef1ecaac5dac99825fe) (grafted from b4e41a9f2c3a6328ada72810407686d11833347c) (grafted from 2b3826c7b3bdf669b397f1ad31ae106a05d7b05b) (grafted from 23737fb5e1d6874cf79a1eb841dd1614c0295a1b) (grafted from 69588396b17d3dafeece8bc9e2101559d871d9fb) (grafted from b3252a277a53b1657e6bcf31359b413d2becffcc) (grafted from 12c8e6062d34d4d6cf0b0128084278800a1ed8f7) (grafted from 8ce5c67748afbe6e82fc3f822e35ddc58cb03694) (grafted from b0f656426efcf9a70386b1c781507f40ab95af49) (grafted from 147ae96993dcffbed2f39f31795ef3d60631d43f) (grafted from 2ecb34a565accf638e6004c59aa5b2d2361f9428) (grafted from 6bfc53cd4c479b4e789d4086a2c7c2f4045a288f) (grafted from bf73f92394a079928db6d4b0b3e7aa78448af91a) (grafted from b69a654342339eb740527fc84af523eb53edeb71) (grafted from 3f090f44e8a33cde8d5708454a5292d0976269e6) (grafted from ac4432275d3b750405e53f67b1267579764f4fee) (grafted from dbfd0bce0eded53dc7d824393f03ddd2f2e693fb) (grafted from bf7087d072ca6c5d5dac2ddef4c43339d02f6133) (grafted from b9d63feb8c90f83e74f3e9a89328419c81088082) (grafted from 718e93a4e545f3e16d09c66f210a567427f1068a) (grafted from e0ba57c8bf13ccc45b7eaa62d64e03038cd002ad) (grafted from 5c849011421ad00ef190c2bf15c640656424f681) (grafted from e833de714167fe6039b42f1cd1890b0470a32ea2) (grafted from 480872890137130564910a29ed8ef3890810f0c4) (grafted from 6224dc455a24542cf7d55721fceb14a08e92d391) (grafted from 24ced5d2b0d6fb837a3994a80ef808e29f62ccc5) (grafted from 452eb5c8624cc22867fafa692c6c7905e46da27a) (grafted from cdc9f1b121878c26c986eca2233b5d03ea50ad74) (grafted from 8b3a45fe3a612fdbee3a1f291f41bfaadfd16a6f) (grafted from 2a07c0b3cb9785a9f8d5d669b885044e4d4544b1) (grafted from 56d892df53cfdf3a13f38cd386a437ea59ef0d77) (grafted from b63c65fad2d28a86a3bc3871d58e45019b11e6a1) (grafted from 8618bd56f309543d8577000a4310fdf8648f1087) (grafted from e04c7ddddc5cc40d6347d2336b81d5be2289243e) (grafted from 5951fe6318d02a9b739f0174f3aecc3d5eead31c) (grafted from 0f4d380f641a55791ca9eef13cd49da24cf40a7a) (grafted from d7ecf3376e572d77b670cbe2184370b08d38dcf7) (grafted from a75534c9e6d7a481303096e44e265593fb5b0b2f)
617 lines
19 KiB
Perl
617 lines
19 KiB
Perl
|
|
This test tries to exercise the ssh functionality with a dummy script
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
> [format]
|
|
> usegeneraldelta=yes
|
|
> EOF
|
|
|
|
creating 'remote' repo
|
|
|
|
$ hg init remote
|
|
$ cd remote
|
|
$ echo this > foo
|
|
$ echo this > fooO
|
|
$ hg ci -A -m "init" foo fooO
|
|
|
|
insert a closed branch (issue4428)
|
|
|
|
$ hg up null
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
$ hg branch closed
|
|
marked working directory as branch closed
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
$ hg ci -mc0
|
|
$ hg ci --close-branch -mc1
|
|
$ hg up -q default
|
|
|
|
configure for serving
|
|
|
|
$ cat <<EOF > .hg/hgrc
|
|
> [server]
|
|
> uncompressed = True
|
|
>
|
|
> [hooks]
|
|
> changegroup = sh -c "printenv.py changegroup-in-remote 0 ../dummylog"
|
|
> EOF
|
|
$ cd ..
|
|
|
|
repo not found error
|
|
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
|
|
remote: abort: repository nonexistent not found!
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
non-existent absolute path
|
|
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/`pwd`/nonexistent local
|
|
remote: abort: repository $TESTTMP/nonexistent not found!
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
clone remote via stream
|
|
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" --stream ssh://user@dummy/remote local-stream
|
|
streaming all changes
|
|
4 files to transfer, 602 bytes of data
|
|
transferred 602 bytes in * seconds (*) (glob)
|
|
searching for changes
|
|
no changes found
|
|
updating to branch default
|
|
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ cd local-stream
|
|
$ hg verify
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
2 files, 3 changesets, 2 total revisions
|
|
$ hg branches
|
|
default 0:1160648e36ce
|
|
$ cd ..
|
|
|
|
clone bookmarks via stream
|
|
|
|
$ hg -R local-stream book mybook
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" --stream ssh://user@dummy/local-stream stream2
|
|
streaming all changes
|
|
4 files to transfer, 602 bytes of data
|
|
transferred 602 bytes in * seconds (*) (glob)
|
|
searching for changes
|
|
no changes found
|
|
updating to branch default
|
|
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ cd stream2
|
|
$ hg book
|
|
mybook 0:1160648e36ce
|
|
$ cd ..
|
|
$ rm -rf local-stream stream2
|
|
|
|
clone remote via pull
|
|
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local
|
|
requesting all changes
|
|
adding changesets
|
|
adding manifests
|
|
adding file changes
|
|
added 3 changesets with 2 changes to 2 files
|
|
new changesets 1160648e36ce:ad076bfb429d
|
|
updating to branch default
|
|
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
verify
|
|
|
|
$ cd local
|
|
$ hg verify
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
2 files, 3 changesets, 2 total revisions
|
|
$ cat >> .hg/hgrc <<EOF
|
|
> [hooks]
|
|
> changegroup = sh -c "printenv.py changegroup-in-local 0 ../dummylog"
|
|
> EOF
|
|
|
|
empty default pull
|
|
|
|
$ hg paths
|
|
default = ssh://user@dummy/remote
|
|
$ hg pull -e "\"$PYTHON\" \"$TESTDIR/dummyssh\""
|
|
pulling from ssh://user@dummy/remote
|
|
searching for changes
|
|
no changes found
|
|
|
|
pull from wrong ssh URL
|
|
|
|
$ hg pull -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/doesnotexist
|
|
pulling from ssh://user@dummy/doesnotexist
|
|
remote: abort: repository doesnotexist not found!
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
local change
|
|
|
|
$ echo bleah > foo
|
|
$ hg ci -m "add"
|
|
|
|
updating rc
|
|
|
|
$ echo "default-push = ssh://user@dummy/remote" >> .hg/hgrc
|
|
$ echo "[ui]" >> .hg/hgrc
|
|
$ echo "ssh = \"$PYTHON\" \"$TESTDIR/dummyssh\"" >> .hg/hgrc
|
|
|
|
find outgoing
|
|
|
|
$ hg out ssh://user@dummy/remote
|
|
comparing with ssh://user@dummy/remote
|
|
searching for changes
|
|
changeset: 3:a28a9d1a809c
|
|
tag: tip
|
|
parent: 0:1160648e36ce
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: add
|
|
|
|
|
|
find incoming on the remote side
|
|
|
|
$ hg incoming -R ../remote -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/local
|
|
comparing with ssh://user@dummy/local
|
|
searching for changes
|
|
changeset: 3:a28a9d1a809c
|
|
tag: tip
|
|
parent: 0:1160648e36ce
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: add
|
|
|
|
|
|
find incoming on the remote side (using absolute path)
|
|
|
|
$ hg incoming -R ../remote -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/`pwd`"
|
|
comparing with ssh://user@dummy/$TESTTMP/local
|
|
searching for changes
|
|
changeset: 3:a28a9d1a809c
|
|
tag: tip
|
|
parent: 0:1160648e36ce
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: add
|
|
|
|
|
|
push
|
|
|
|
$ hg push
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
remote: adding changesets
|
|
remote: adding manifests
|
|
remote: adding file changes
|
|
remote: added 1 changesets with 1 changes to 1 files
|
|
$ cd ../remote
|
|
|
|
check remote tip
|
|
|
|
$ hg tip
|
|
changeset: 3:a28a9d1a809c
|
|
tag: tip
|
|
parent: 0:1160648e36ce
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: add
|
|
|
|
$ hg verify
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
2 files, 4 changesets, 3 total revisions
|
|
$ hg cat -r tip foo
|
|
bleah
|
|
$ echo z > z
|
|
$ hg ci -A -m z z
|
|
created new head
|
|
|
|
test pushkeys and bookmarks
|
|
|
|
$ cd ../local
|
|
$ hg debugpushkey --config ui.ssh="\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote namespaces
|
|
bookmarks
|
|
namespaces
|
|
phases
|
|
$ hg book foo -r 0
|
|
$ hg out -B
|
|
comparing with ssh://user@dummy/remote
|
|
searching for changed bookmarks
|
|
foo 1160648e36ce
|
|
$ hg push -B foo
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
no changes found
|
|
exporting bookmark foo
|
|
[1]
|
|
$ hg debugpushkey --config ui.ssh="\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote bookmarks
|
|
foo 1160648e36cec0054048a7edc4110c6f84fde594
|
|
$ hg book -f foo
|
|
$ hg push --traceback
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
no changes found
|
|
updating bookmark foo
|
|
[1]
|
|
$ hg book -d foo
|
|
$ hg in -B
|
|
comparing with ssh://user@dummy/remote
|
|
searching for changed bookmarks
|
|
foo a28a9d1a809c
|
|
$ hg book -f -r 0 foo
|
|
$ hg pull -B foo
|
|
pulling from ssh://user@dummy/remote
|
|
no changes found
|
|
updating bookmark foo
|
|
$ hg book -d foo
|
|
$ hg push -B foo
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
no changes found
|
|
deleting remote bookmark foo
|
|
[1]
|
|
|
|
a bad, evil hook that prints to stdout
|
|
|
|
$ cat <<EOF > $TESTTMP/badhook
|
|
> import sys
|
|
> sys.stdout.write("KABOOM\n")
|
|
> EOF
|
|
|
|
$ cat <<EOF > $TESTTMP/badpyhook.py
|
|
> import sys
|
|
> def hook(ui, repo, hooktype, **kwargs):
|
|
> sys.stdout.write("KABOOM IN PROCESS\n")
|
|
> EOF
|
|
|
|
$ cat <<EOF >> ../remote/.hg/hgrc
|
|
> [hooks]
|
|
> changegroup.stdout = $PYTHON $TESTTMP/badhook
|
|
> changegroup.pystdout = python:$TESTTMP/badpyhook.py:hook
|
|
> EOF
|
|
$ echo r > r
|
|
$ hg ci -A -m z r
|
|
|
|
push should succeed even though it has an unexpected response
|
|
|
|
$ hg push
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
remote has heads on branch 'default' that are not known locally: 6c0482d977a3
|
|
remote: adding changesets
|
|
remote: adding manifests
|
|
remote: adding file changes
|
|
remote: added 1 changesets with 1 changes to 1 files
|
|
remote: KABOOM
|
|
remote: KABOOM IN PROCESS
|
|
$ hg -R ../remote heads
|
|
changeset: 5:1383141674ec
|
|
tag: tip
|
|
parent: 3:a28a9d1a809c
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: z
|
|
|
|
changeset: 4:6c0482d977a3
|
|
parent: 0:1160648e36ce
|
|
user: test
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
summary: z
|
|
|
|
|
|
clone bookmarks
|
|
|
|
$ hg -R ../remote bookmark test
|
|
$ hg -R ../remote bookmarks
|
|
* test 4:6c0482d977a3
|
|
$ hg clone -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local-bookmarks
|
|
requesting all changes
|
|
adding changesets
|
|
adding manifests
|
|
adding file changes
|
|
added 6 changesets with 5 changes to 4 files (+1 heads)
|
|
new changesets 1160648e36ce:1383141674ec
|
|
updating to branch default
|
|
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ hg -R local-bookmarks bookmarks
|
|
test 4:6c0482d977a3
|
|
|
|
passwords in ssh urls are not supported
|
|
(we use a glob here because different Python versions give different
|
|
results here)
|
|
|
|
$ hg push ssh://user:erroneouspwd@dummy/remote
|
|
pushing to ssh://user:*@dummy/remote (glob)
|
|
abort: password in URL not supported!
|
|
[255]
|
|
|
|
$ cd ..
|
|
|
|
hide outer repo
|
|
$ hg init
|
|
|
|
Test remote paths with spaces (issue2983):
|
|
|
|
$ hg init --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
|
|
$ touch "$TESTTMP/a repo/test"
|
|
$ hg -R 'a repo' commit -A -m "test"
|
|
adding test
|
|
$ hg -R 'a repo' tag tag
|
|
$ hg id --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
|
|
73649e48688a
|
|
|
|
$ hg id --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo#noNoNO"
|
|
abort: unknown revision 'noNoNO'!
|
|
[255]
|
|
|
|
Test (non-)escaping of remote paths with spaces when cloning (issue3145):
|
|
|
|
$ hg clone --ssh "\"$PYTHON\" \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
|
|
destination directory: a repo
|
|
abort: destination 'a repo' is not empty
|
|
[255]
|
|
|
|
Make sure hg is really paranoid in serve --stdio mode. It used to be
|
|
possible to get a debugger REPL by specifying a repo named --debugger.
|
|
$ hg -R --debugger serve --stdio
|
|
abort: potentially unsafe serve --stdio invocation: ['-R', '--debugger', 'serve', '--stdio']
|
|
[255]
|
|
$ hg -R --config=ui.debugger=yes serve --stdio
|
|
abort: potentially unsafe serve --stdio invocation: ['-R', '--config=ui.debugger=yes', 'serve', '--stdio']
|
|
[255]
|
|
Abbreviations of 'serve' also don't work, to avoid shenanigans.
|
|
$ hg -R narf serv --stdio
|
|
abort: potentially unsafe serve --stdio invocation: ['-R', 'narf', 'serv', '--stdio']
|
|
[255]
|
|
|
|
Test hg-ssh using a helper script that will restore PYTHONPATH (which might
|
|
have been cleared by a hg.exe wrapper) and invoke hg-ssh with the right
|
|
parameters:
|
|
|
|
$ cat > ssh.sh << EOF
|
|
> userhost="\$1"
|
|
> SSH_ORIGINAL_COMMAND="\$2"
|
|
> export SSH_ORIGINAL_COMMAND
|
|
> PYTHONPATH="$PYTHONPATH"
|
|
> export PYTHONPATH
|
|
> "$PYTHON" "$TESTDIR/../contrib/hg-ssh" "$TESTTMP/a repo"
|
|
> EOF
|
|
|
|
$ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a repo"
|
|
73649e48688a
|
|
|
|
$ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a'repo"
|
|
remote: Illegal repository "$TESTTMP/a'repo"
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
$ hg id --ssh "sh ssh.sh" --remotecmd hacking "ssh://user@dummy/a'repo"
|
|
remote: Illegal command "hacking -R 'a'\''repo' serve --stdio"
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
$ SSH_ORIGINAL_COMMAND="'hg' -R 'a'repo' serve --stdio" $PYTHON "$TESTDIR/../contrib/hg-ssh"
|
|
Illegal command "'hg' -R 'a'repo' serve --stdio": No closing quotation
|
|
[255]
|
|
|
|
Test hg-ssh in read-only mode:
|
|
|
|
$ cat > ssh.sh << EOF
|
|
> userhost="\$1"
|
|
> SSH_ORIGINAL_COMMAND="\$2"
|
|
> export SSH_ORIGINAL_COMMAND
|
|
> PYTHONPATH="$PYTHONPATH"
|
|
> export PYTHONPATH
|
|
> "$PYTHON" "$TESTDIR/../contrib/hg-ssh" --read-only "$TESTTMP/remote"
|
|
> EOF
|
|
|
|
$ hg clone --ssh "sh ssh.sh" "ssh://user@dummy/$TESTTMP/remote" read-only-local
|
|
requesting all changes
|
|
adding changesets
|
|
adding manifests
|
|
adding file changes
|
|
added 6 changesets with 5 changes to 4 files (+1 heads)
|
|
new changesets 1160648e36ce:1383141674ec
|
|
updating to branch default
|
|
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cd read-only-local
|
|
$ echo "baz" > bar
|
|
$ hg ci -A -m "unpushable commit" bar
|
|
$ hg push --ssh "sh ../ssh.sh"
|
|
pushing to ssh://user@dummy/*/remote (glob)
|
|
searching for changes
|
|
remote: Permission denied
|
|
remote: pretxnopen.readonlyrejectpush hook failed
|
|
abort: push failed on remote
|
|
[255]
|
|
|
|
$ cd ..
|
|
|
|
stderr from remote commands should be printed before stdout from local code (issue4336)
|
|
|
|
$ hg clone remote stderr-ordering
|
|
updating to branch default
|
|
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ cd stderr-ordering
|
|
$ cat >> localwrite.py << EOF
|
|
> from mercurial import exchange, extensions
|
|
>
|
|
> def wrappedpush(orig, repo, *args, **kwargs):
|
|
> res = orig(repo, *args, **kwargs)
|
|
> repo.ui.write('local stdout\n')
|
|
> return res
|
|
>
|
|
> def extsetup(ui):
|
|
> extensions.wrapfunction(exchange, 'push', wrappedpush)
|
|
> EOF
|
|
|
|
$ cat >> .hg/hgrc << EOF
|
|
> [paths]
|
|
> default-push = ssh://user@dummy/remote
|
|
> [ui]
|
|
> ssh = "$PYTHON" "$TESTDIR/dummyssh"
|
|
> [extensions]
|
|
> localwrite = localwrite.py
|
|
> EOF
|
|
|
|
$ echo localwrite > foo
|
|
$ hg commit -m 'testing localwrite'
|
|
$ hg push
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
remote: adding changesets
|
|
remote: adding manifests
|
|
remote: adding file changes
|
|
remote: added 1 changesets with 1 changes to 1 files
|
|
remote: KABOOM
|
|
remote: KABOOM IN PROCESS
|
|
local stdout
|
|
|
|
debug output
|
|
|
|
$ hg pull --debug ssh://user@dummy/remote
|
|
pulling from ssh://user@dummy/remote
|
|
running .* ".*/dummyssh" ['"]user@dummy['"] ('|")hg -R remote serve --stdio('|") (re)
|
|
sending hello command
|
|
sending between command
|
|
remote: 384
|
|
remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch streamreqs=generaldelta,revlogv1 $USUAL_BUNDLE2_CAPS$ unbundle=HG10GZ,HG10BZ,HG10UN
|
|
remote: 1
|
|
query 1; heads
|
|
sending batch command
|
|
searching for changes
|
|
all remote heads known locally
|
|
no changes found
|
|
sending getbundle command
|
|
bundle2-input-bundle: with-transaction
|
|
bundle2-input-part: "bookmarks" supported
|
|
bundle2-input-part: total payload size 26
|
|
bundle2-input-part: "listkeys" (params: 1 mandatory) supported
|
|
bundle2-input-part: total payload size 45
|
|
bundle2-input-part: "phase-heads" supported
|
|
bundle2-input-part: total payload size 72
|
|
bundle2-input-bundle: 2 parts total
|
|
checking for updated bookmarks
|
|
|
|
$ cd ..
|
|
|
|
$ cat dummylog
|
|
Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R $TESTTMP/nonexistent serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R local-stream serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R doesnotexist serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R local serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R $TESTTMP/local serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
changegroup-in-remote hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=a28a9d1a809cab7d4e2fde4bee738a9ede948b60 HG_NODE_LAST=a28a9d1a809cab7d4e2fde4bee738a9ede948b60 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:ssh:$LOCALIP
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
changegroup-in-remote hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=1383141674ec756a6056f6a9097618482fe0f4a6 HG_NODE_LAST=1383141674ec756a6056f6a9097618482fe0f4a6 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:ssh:$LOCALIP
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
Got arguments 1:user@dummy 2:hg init 'a repo'
|
|
Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
changegroup-in-remote hook: HG_BUNDLE2=1 HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=65c38f4125f9602c8db4af56530cc221d93b8ef8 HG_NODE_LAST=65c38f4125f9602c8db4af56530cc221d93b8ef8 HG_SOURCE=serve HG_TXNID=TXN:$ID$ HG_URL=remote:ssh:$LOCALIP
|
|
Got arguments 1:user@dummy 2:hg -R remote serve --stdio
|
|
|
|
remote hook failure is attributed to remote
|
|
|
|
$ cat > $TESTTMP/failhook << EOF
|
|
> def hook(ui, repo, **kwargs):
|
|
> ui.write('hook failure!\n')
|
|
> ui.flush()
|
|
> return 1
|
|
> EOF
|
|
|
|
$ echo "pretxnchangegroup.fail = python:$TESTTMP/failhook:hook" >> remote/.hg/hgrc
|
|
|
|
$ hg -q --config ui.ssh="\"$PYTHON\" $TESTDIR/dummyssh" clone ssh://user@dummy/remote hookout
|
|
$ cd hookout
|
|
$ touch hookfailure
|
|
$ hg -q commit -A -m 'remote hook failure'
|
|
$ hg --config ui.ssh="\"$PYTHON\" $TESTDIR/dummyssh" push
|
|
pushing to ssh://user@dummy/remote
|
|
searching for changes
|
|
remote: adding changesets
|
|
remote: adding manifests
|
|
remote: adding file changes
|
|
remote: added 1 changesets with 1 changes to 1 files
|
|
remote: hook failure!
|
|
remote: transaction abort!
|
|
remote: rollback completed
|
|
remote: pretxnchangegroup.fail hook failed
|
|
abort: push failed on remote
|
|
[255]
|
|
|
|
abort during pull is properly reported as such
|
|
|
|
$ echo morefoo >> ../remote/foo
|
|
$ hg -R ../remote commit --message "more foo to be pulled"
|
|
$ cat >> ../remote/.hg/hgrc << EOF
|
|
> [extensions]
|
|
> crash = ${TESTDIR}/crashgetbundler.py
|
|
> EOF
|
|
$ hg --config ui.ssh="\"$PYTHON\" $TESTDIR/dummyssh" pull
|
|
pulling from ssh://user@dummy/remote
|
|
searching for changes
|
|
remote: abort: this is an exercise
|
|
abort: pull failed on remote
|
|
[255]
|
|
|
|
abort with no error hint when there is a ssh problem when pulling
|
|
|
|
$ hg pull ssh://brokenrepository -e "\"$PYTHON\" \"$TESTDIR/dummyssh\""
|
|
pulling from ssh://brokenrepository/
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|
|
abort with configured error hint when there is a ssh problem when pulling
|
|
|
|
$ hg pull ssh://brokenrepository -e "\"$PYTHON\" \"$TESTDIR/dummyssh\"" \
|
|
> --config ui.ssherrorhint="Please see http://company/internalwiki/ssh.html"
|
|
pulling from ssh://brokenrepository/
|
|
abort: no suitable response from remote hg!
|
|
(Please see http://company/internalwiki/ssh.html)
|
|
[255]
|
|
|
|
test that custom environment is passed down to ssh executable
|
|
$ cat >>dumpenv <<EOF
|
|
> #! /bin/sh
|
|
> echo \$VAR >&2
|
|
> EOF
|
|
$ chmod +x dumpenv
|
|
$ hg pull ssh://something --config ui.ssh="./dumpenv"
|
|
pulling from ssh://something/
|
|
remote:
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
$ hg pull ssh://something --config ui.ssh="./dumpenv" --config sshenv.VAR=17
|
|
pulling from ssh://something/
|
|
remote: 17
|
|
abort: no suitable response from remote hg!
|
|
[255]
|
|
|