diff --git a/TODO b/TODO
index 53872e2be33a09350ee57384574f9fcab78f1b41_VE9ETw==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_VE9ETw== 100644
--- a/TODO
+++ b/TODO
@@ -15,8 +15,8 @@
 - directory foo.d or foo.i with existing file foo (use some quoting?)
 - get various options from hgrc (e.g. history always -v, tip always -q)
 - better push support (hack exists)
-- hg over ssh:// and https://
-- commit mailinglist/trigger/hooks
+- hg over ssh:// and https:// and rsync://
+- hooks for new changesets getting pulled/imported etc.
 - make showing removed files (in history etc.) faster.
 
 Commands:
@@ -26,8 +26,6 @@
 - select to pull a subset of the heads
 - commands.py: number of args too much magic (e.g. in patch())
 - automatic pull fallback to old-http://
-- hg pull http://example.com doesn't say that no repo was found
-- hg annotate -u and hgweb annotate with long $EMAIL
 - hg pull default in a subdir doesn't work, if it is a relative path
 - optionally only show merges (two parents or parent != changeset-1, etc.)
 
diff --git a/hgeditor b/hgeditor
index 53872e2be33a09350ee57384574f9fcab78f1b41_aGdlZGl0b3I=..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_aGdlZGl0b3I= 100755
--- a/hgeditor
+++ b/hgeditor
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 #
 # This is an example of using HGEDITOR to automate the signing of
 # commits and so on.
diff --git a/hgmerge b/hgmerge
index 53872e2be33a09350ee57384574f9fcab78f1b41_aGdtZXJnZQ==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_aGdtZXJnZQ== 100755
--- a/hgmerge
+++ b/hgmerge
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 #
 # hgmerge - default merge helper for Mercurial
 #
diff --git a/mercurial/commands.py b/mercurial/commands.py
index 53872e2be33a09350ee57384574f9fcab78f1b41_bWVyY3VyaWFsL2NvbW1hbmRzLnB5..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_bWVyY3VyaWFsL2NvbW1hbmRzLnB5 100644
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -137,7 +137,7 @@
         if ui.verbose:
             ui.status("description:\n")
             ui.status(description)
-            ui.status("\n")
+            ui.status("\n\n")
         else:
             ui.status("summary:     %s\n" % description.splitlines()[0])
     ui.status("\n")
@@ -295,7 +295,9 @@
     d = dircleanup(dest)
 
     link = 0
-    if not source.startswith("http://"):
+    if not (source.startswith("http://") or
+            source.startswith("hg://") or
+            source.startswith("old-http://")):
         d1 = os.stat(dest).st_dev
         d2 = os.stat(source).st_dev
         if d1 == d2: link = 1
diff --git a/tests/fish-merge b/tests/fish-merge
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvZmlzaC1tZXJnZQ==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvZmlzaC1tZXJnZQ== 100644
--- a/tests/fish-merge
+++ b/tests/fish-merge
@@ -1,3 +1,5 @@
+#!/bin/sh
+
 set -e
 set -x
 
diff --git a/tests/run-tests b/tests/run-tests
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvcnVuLXRlc3Rz..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvcnVuLXRlc3Rz 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -1,6 +1,4 @@
-#!/bin/bash
-
-set -e
+#!/bin/sh -e
 
 export LANG=C
 export LC_CTYPE="C"
@@ -47,7 +45,7 @@
     rm -f $1.err
     export TZ=GMT
     D=`mktemp -d`
-    if [ "$D" == "" ] ; then
+    if [ "$D" = "" ] ; then
 	echo mktemp failed!
     fi
 
@@ -77,7 +75,7 @@
 }
 
 TESTS=$@
-if [ "$TESTS" == "" ] ; then
+if [ "$TESTS" = "" ] ; then
     TESTS=`ls test-* | grep -Ev "\.|~"`
 fi
 
diff --git a/tests/test-bad-pull b/tests/test-bad-pull
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1iYWQtcHVsbA==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1iYWQtcHVsbA== 100755
--- a/tests/test-bad-pull
+++ b/tests/test-bad-pull
@@ -1,4 +1,4 @@
-#!/bin/bash -x
+#!/bin/sh -x
 
 hg clone http://localhost:20059/ copy
 echo $?
@@ -18,6 +18,7 @@
 EOF
 
 python dumb.py 2>/dev/null &
+sleep 2
 
 hg clone http://localhost:20059/foo copy2
 echo $?
diff --git a/tests/test-bad-pull.out b/tests/test-bad-pull.out
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1iYWQtcHVsbC5vdXQ=..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1iYWQtcHVsbC5vdXQ= 100644
--- a/tests/test-bad-pull.out
+++ b/tests/test-bad-pull.out
@@ -10,6 +10,7 @@
 ls: copy: No such file or directory
 + cat
 + python dumb.py
++ sleep 2
 + hg clone http://localhost:20059/foo copy2
 requesting all changes
 adding changesets
diff --git a/tests/test-basic b/tests/test-basic
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1iYXNpYw==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1iYXNpYw== 100755
--- a/tests/test-basic
+++ b/tests/test-basic
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 mkdir t
@@ -10,4 +10,4 @@
 hg history
 hg manifest
 hg cat a
-hg verify
\ No newline at end of file
+hg verify
diff --git a/tests/test-conflict b/tests/test-conflict
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1jb25mbGljdA==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1jb25mbGljdA== 100755
--- a/tests/test-conflict
+++ b/tests/test-conflict
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 hg init
diff --git a/tests/test-copy b/tests/test-copy
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1jb3B5..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1jb3B5 100755
--- a/tests/test-copy
+++ b/tests/test-copy
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 hg init
diff --git a/tests/test-help b/tests/test-help
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1oZWxw..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1oZWxw 100755
--- a/tests/test-help
+++ b/tests/test-help
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 
diff --git a/tests/test-pull b/tests/test-pull
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1wdWxs..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1wdWxs 100755
--- a/tests/test-pull
+++ b/tests/test-pull
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 mkdir test
 cd test
diff --git a/tests/test-rawcommit1.out b/tests/test-rawcommit1.out
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1yYXdjb21taXQxLm91dA==..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1yYXdjb21taXQxLm91dA== 100644
--- a/tests/test-rawcommit1.out
+++ b/tests/test-rawcommit1.out
@@ -28,6 +28,7 @@
 description:
 2
 
+
 + rm b
 + hg -d rawcommit -p 2 -d '0 0' -u user -t3 b
 + hg -d manifest 3
@@ -45,6 +46,7 @@
 description:
 3
 
+
 + echo this is a22
 + hg -d rawcommit -p 3 -d '0 0' -u user -t4 a
 + hg -d manifest 4
@@ -62,6 +64,7 @@
 description:
 4
 
+
 + echo this is c22
 + hg -d rawcommit -p 1 -d '0 0' -u user -t5 c
 + hg -d manifest 5
@@ -79,6 +82,7 @@
 description:
 4
 
+
 + hg -d rawcommit -p 4 -p 5 -d '0 0' -u user -t6
 + hg -d manifest 6
 d6e3c4976c13feb1728cd3ac851abaf7256a5c23 644 a
@@ -94,6 +98,7 @@
 description:
 6
 
+
 + hg -d rawcommit -p 6 -d '0 0' -u user -t7
 + hg -d manifest 7
 d6e3c4976c13feb1728cd3ac851abaf7256a5c23 644 a
@@ -109,3 +114,4 @@
 description:
 7
 
+
diff --git a/tests/test-simple-update b/tests/test-simple-update
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC1zaW1wbGUtdXBkYXRl..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC1zaW1wbGUtdXBkYXRl 100755
--- a/tests/test-simple-update
+++ b/tests/test-simple-update
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -ex
 
diff --git a/tests/test-tags b/tests/test-tags
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC10YWdz..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC10YWdz 100755
--- a/tests/test-tags
+++ b/tests/test-tags
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 mkdir t
diff --git a/tests/test-undo b/tests/test-undo
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC11bmRv..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC11bmRv 100755
--- a/tests/test-undo
+++ b/tests/test-undo
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 mkdir t
diff --git a/tests/test-up-local-change b/tests/test-up-local-change
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC11cC1sb2NhbC1jaGFuZ2U=..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC11cC1sb2NhbC1jaGFuZ2U= 100755
--- a/tests/test-up-local-change
+++ b/tests/test-up-local-change
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 export HGMERGE=true
 
diff --git a/tests/test-up-local-change.out b/tests/test-up-local-change.out
index 53872e2be33a09350ee57384574f9fcab78f1b41_dGVzdHMvdGVzdC11cC1sb2NhbC1jaGFuZ2Uub3V0..4fc63e22b1fe707bb542ab1149403daa9a77cdf8_dGVzdHMvdGVzdC11cC1sb2NhbC1jaGFuZ2Uub3V0 100644
--- a/tests/test-up-local-change.out
+++ b/tests/test-up-local-change.out
@@ -54,6 +54,7 @@
 description:
 2
 
+
 changeset:   0:c19d34741b0a4ced8e4ba74bb834597d5193851e
 manifest:    0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
 user:        test
@@ -62,6 +63,7 @@
 description:
 1
 
+
 + hg diff
 + sed 's/\(\(---\|+++\).*\)\t.*/\1/'
 diff -r 1e71731e6fbb a