tests/test-ssh-bundle1.t
changeset 25375 b08887e723a9
parent 25367 d0f1d8b4de57
child 25401 d29201352af7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-ssh-bundle1.t	Wed May 27 11:55:39 2015 -0700
@@ -0,0 +1,512 @@
+This test is a duplicate of 'test-http.t' feel free to factor out
+parts that are not bundle1/bundle2 specific.
+
+  $ cat << EOF >> $HGRCPATH
+  > [experimental]
+  > # This test is dedicated to interaction through old bundle
+  > bundle2-exp = False
+  > EOF
+
+
+This test tries to exercise the ssh functionality with a dummy script
+
+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 = python "$TESTDIR/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: there is no Mercurial repository here (.hg 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: there is no Mercurial repository here (.hg not found)!
+  abort: no suitable response from remote hg!
+  [255]
+
+clone remote via stream
+
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" --uncompressed ssh://user@dummy/remote local-stream
+  streaming all changes
+  4 files to transfer, 615 bytes of data
+  transferred 615 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\"" --uncompressed ssh://user@dummy/local-stream stream2
+  streaming all changes
+  4 files to transfer, 615 bytes of data
+  transferred 615 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
+  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
+  $ echo '[hooks]' >> .hg/hgrc
+  $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup-in-local 0 ../dummylog" >> .hg/hgrc
+
+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: there is no Mercurial repository here (.hg 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
+
+  $ echo '[hooks]' >> ../remote/.hg/hgrc
+  $ echo "changegroup.stdout = python $TESTTMP/badhook" >> ../remote/.hg/hgrc
+  $ 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
+  $ 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)
+  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]
+
+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" (glob)
+  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)
+  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: abort: pretxnopen.hg-ssh hook failed
+  remote: Permission denied
+  remote: pushkey-abort: prepushkey.hg-ssh hook failed
+  updating 6c0482d977a3 to public failed!
+  [1]
+
+  $ 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
+  local stdout
+
+debug output
+
+  $ hg pull --debug ssh://user@dummy/remote
+  pulling from ssh://user@dummy/remote
+  running python "*/dummyssh" user@dummy 'hg -R remote serve --stdio' (glob)
+  sending hello command
+  sending between command
+  remote: 271
+  remote: capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
+  remote: 1
+  preparing listkeys for "bookmarks"
+  sending listkeys command
+  received listkey for "bookmarks": 45 bytes
+  query 1; heads
+  sending batch command
+  searching for changes
+  all remote heads known locally
+  no changes found
+  preparing listkeys for "phases"
+  sending listkeys command
+  received listkey for "phases": 15 bytes
+  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_NODE=a28a9d1a809cab7d4e2fde4bee738a9ede948b60 HG_SOURCE=serve HG_TXNID=TXN:* HG_URL=remote:ssh:127.0.0.1 (glob)
+  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_NODE=1383141674ec756a6056f6a9097618482fe0f4a6 HG_SOURCE=serve HG_TXNID=TXN:* HG_URL=remote:ssh:127.0.0.1 (glob)
+  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_NODE=65c38f4125f9602c8db4af56530cc221d93b8ef8 HG_SOURCE=serve HG_TXNID=TXN:* HG_URL=remote:ssh:127.0.0.1 (glob)
+  Got arguments 1:user@dummy 2:hg -R remote serve --stdio