tests: unify test-rename
authorNicolas Dumazet <nicdumz.commits@gmail.com>
Mon, 30 Aug 2010 12:58:43 +0900
changeset 12098 12108d7f2ce1
parent 12097 389c215885c5
child 12099 54c9549ccb22
tests: unify test-rename
tests/test-bisect.t
tests/test-churn.t
tests/test-inherit-mode.t
tests/test-rename
tests/test-rename.out
tests/test-rename.t
tests/test-strict.t
--- a/tests/test-rename	Mon Aug 30 12:48:17 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,260 +0,0 @@
-#!/bin/sh
-
-hg init
-mkdir d1 d1/d11 d2
-echo d1/a > d1/a
-echo d1/ba > d1/ba
-echo d1/a1 > d1/d11/a1
-echo d1/b > d1/b
-echo d2/b > d2/b
-hg add d1/a d1/b d1/ba d1/d11/a1 d2/b
-hg commit -m "1" -d "1000000 0"
-
-echo "# rename a single file"
-hg rename d1/d11/a1 d2/c
-hg sum
-hg status -C
-hg update -C
-rm d2/c
-
-echo "# rename --after a single file"
-mv d1/d11/a1 d2/c
-hg rename --after d1/d11/a1 d2/c
-hg status -C
-hg update -C
-rm d2/c
-
-echo '# rename --after a single file when src and tgt already tracked'
-mv d1/d11/a1 d2/c
-hg addrem -s 0
-hg rename --after d1/d11/a1 d2/c
-hg status -C
-hg update -C
-rm d2/c
-
-echo "# rename --after a single file to a nonexistant target filename"
-hg rename --after d1/a dummy
-
-echo "# move a single file to an existing directory"
-hg rename d1/d11/a1 d2
-hg status -C
-hg update -C
-rm d2/a1
-
-echo "# move --after a single file to an existing directory"
-mv d1/d11/a1 d2
-hg rename --after d1/d11/a1 d2
-hg status -C
-hg update -C
-rm d2/a1
-
-echo "# rename a file using a relative path"
-(cd d1/d11; hg rename ../../d2/b e)
-hg status -C
-hg update -C
-rm d1/d11/e
-
-echo "# rename --after a file using a relative path"
-(cd d1/d11; mv ../../d2/b e; hg rename --after ../../d2/b e)
-hg status -C
-hg update -C
-rm d1/d11/e
-
-echo "# rename directory d1 as d3"
-hg rename d1/ d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# rename --after directory d1 as d3"
-mv d1 d3
-hg rename --after d1 d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move a directory using a relative path"
-(cd d2; mkdir d3; hg rename ../d1/d11 d3)
-hg status -C
-hg update -C
-rm -rf d2/d3
-
-echo "# move --after a directory using a relative path"
-(cd d2; mkdir d3; mv ../d1/d11 d3; hg rename --after ../d1/d11 d3)
-hg status -C
-hg update -C
-rm -rf d2/d3
-
-echo "# move directory d1/d11 to an existing directory d2 (removes empty d1)"
-hg rename d1/d11/ d2
-hg status -C
-hg update -C
-rm -rf d2/d11
-
-echo "# move directories d1 and d2 to a new directory d3"
-mkdir d3
-hg rename d1 d2 d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move --after directories d1 and d2 to a new directory d3"
-mkdir d3
-mv d1 d2 d3
-hg rename --after d1 d2 d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move everything under directory d1 to existing directory d2, do not"
-echo "# overwrite existing files (d2/b)"
-hg rename d1/* d2
-hg status -C
-diff d1/b d2/b
-hg update -C
-rm d2/a d2/ba d2/d11/a1
-
-echo "# attempt to move one file into a non-existent directory"
-hg rename d1/a dx/
-hg status -C
-hg update -C
-
-echo "# attempt to move potentially more than one file into a non-existent"
-echo "# directory"
-hg rename 'glob:d1/**' dx
-
-echo "# move every file under d1 to d2/d21 (glob)"
-mkdir d2/d21
-hg rename 'glob:d1/**' d2/d21
-hg status -C
-hg update -C
-rm -rf d2/d21
-
-echo "# move --after some files under d1 to d2/d21 (glob)"
-mkdir d2/d21
-mv d1/a d1/d11/a1 d2/d21
-hg rename --after 'glob:d1/**' d2/d21
-hg status -C
-hg update -C
-rm -rf d2/d21
-
-echo "# move every file under d1 starting with an 'a' to d2/d21 (regexp)"
-mkdir d2/d21
-hg rename 're:d1/([^a][^/]*/)*a.*' d2/d21
-hg status -C
-hg update -C
-rm -rf d2/d21
-
-echo "# attempt to overwrite an existing file"
-echo "ca" > d1/ca
-hg rename d1/ba d1/ca
-hg status -C
-hg update -C
-
-echo "# forced overwrite of an existing file"
-echo "ca" > d1/ca
-hg rename --force d1/ba d1/ca
-hg status -C
-hg update -C
-rm d1/ca
-
-echo "# replace a symlink with a file"
-ln -s ba d1/ca
-hg rename --force d1/ba d1/ca
-hg status -C
-hg update -C
-rm d1/ca
-
-echo "# do not copy more than one source file to the same destination file"
-mkdir d3
-hg rename d1/* d2/* d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move a whole subtree with \"hg rename .\""
-mkdir d3
-(cd d1; hg rename . ../d3)
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move a whole subtree with \"hg rename --after .\""
-mkdir d3
-mv d1/* d3
-(cd d1; hg rename --after . ../d3)
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# move the parent tree with \"hg rename ..\""
-(cd d1/d11; hg rename .. ../../d3)
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# skip removed files"
-hg remove d1/b
-hg rename d1 d3
-hg status -C
-hg update -C
-rm -rf d3
-
-echo "# transitive rename"
-hg rename d1/b d1/bb
-hg rename d1/bb d1/bc
-hg status -C
-hg update -C
-rm d1/bc
-
-echo "# transitive rename --after"
-hg rename d1/b d1/bb
-mv d1/bb d1/bc
-hg rename --after d1/bb d1/bc
-hg status -C
-hg update -C
-rm d1/bc
-
-echo "# idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)"
-hg rename d1/b d1/bb
-echo "some stuff added to d1/bb" >> d1/bb
-hg rename d1/bb d1/b
-hg status -C
-hg update -C
-
-echo '# overwriting with renames (issue1959)'
-hg rename d1/a d1/c
-hg rename d1/b d1/a
-hg status -C
-hg diff --git
-hg update -C
-
-echo "# check illegal path components"
-
-hg rename d1/d11/a1 .hg/foo
-hg status -C
-hg rename d1/d11/a1 ../foo
-hg status -C
-
-mv d1/d11/a1 .hg/foo
-hg rename --after d1/d11/a1 .hg/foo
-hg status -C
-hg update -C
-rm .hg/foo
-
-hg rename d1/d11/a1 .hg
-hg status -C
-hg rename d1/d11/a1 ..
-hg status -C
-
-mv d1/d11/a1 .hg
-hg rename --after d1/d11/a1 .hg
-hg status -C
-hg update -C
-rm .hg/a1
-
-(cd d1/d11; hg rename ../../d2/b ../../.hg/foo)
-hg status -C
-(cd d1/d11; hg rename ../../d2/b ../../../foo)
-hg status -C
-
--- a/tests/test-rename.out	Mon Aug 30 12:48:17 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,344 +0,0 @@
-# rename a single file
-parent: 0:6f9914c7a010 tip
- 1
-branch: default
-commit: 1 renamed
-update: (current)
-A d2/c
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename --after a single file
-A d2/c
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename --after a single file when src and tgt already tracked
-removing d1/d11/a1
-adding d2/c
-A d2/c
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename --after a single file to a nonexistant target filename
-d1/a: not recording move - dummy does not exist
-# move a single file to an existing directory
-A d2/a1
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move --after a single file to an existing directory
-A d2/a1
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename a file using a relative path
-A d1/d11/e
-  d2/b
-R d2/b
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename --after a file using a relative path
-A d1/d11/e
-  d2/b
-R d2/b
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename directory d1 as d3
-moving d1/a to d3/a
-moving d1/b to d3/b
-moving d1/ba to d3/ba
-moving d1/d11/a1 to d3/d11/a1
-A d3/a
-  d1/a
-A d3/b
-  d1/b
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# rename --after directory d1 as d3
-moving d1/a to d3/a
-moving d1/b to d3/b
-moving d1/ba to d3/ba
-moving d1/d11/a1 to d3/d11/a1
-A d3/a
-  d1/a
-A d3/b
-  d1/b
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move a directory using a relative path
-moving ../d1/d11/a1 to d3/d11/a1
-A d2/d3/d11/a1
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move --after a directory using a relative path
-moving ../d1/d11/a1 to d3/d11/a1
-A d2/d3/d11/a1
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move directory d1/d11 to an existing directory d2 (removes empty d1)
-moving d1/d11/a1 to d2/d11/a1
-A d2/d11/a1
-  d1/d11/a1
-R d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move directories d1 and d2 to a new directory d3
-moving d1/a to d3/d1/a
-moving d1/b to d3/d1/b
-moving d1/ba to d3/d1/ba
-moving d1/d11/a1 to d3/d1/d11/a1
-moving d2/b to d3/d2/b
-A d3/d1/a
-  d1/a
-A d3/d1/b
-  d1/b
-A d3/d1/ba
-  d1/ba
-A d3/d1/d11/a1
-  d1/d11/a1
-A d3/d2/b
-  d2/b
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-R d2/b
-5 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move --after directories d1 and d2 to a new directory d3
-moving d1/a to d3/d1/a
-moving d1/b to d3/d1/b
-moving d1/ba to d3/d1/ba
-moving d1/d11/a1 to d3/d1/d11/a1
-moving d2/b to d3/d2/b
-A d3/d1/a
-  d1/a
-A d3/d1/b
-  d1/b
-A d3/d1/ba
-  d1/ba
-A d3/d1/d11/a1
-  d1/d11/a1
-A d3/d2/b
-  d2/b
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-R d2/b
-5 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move everything under directory d1 to existing directory d2, do not
-# overwrite existing files (d2/b)
-d2/b: not overwriting - file exists
-moving d1/d11/a1 to d2/d11/a1
-A d2/a
-  d1/a
-A d2/ba
-  d1/ba
-A d2/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/ba
-R d1/d11/a1
-1c1
-< d1/b
----
-> d2/b
-3 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# attempt to move one file into a non-existent directory
-abort: destination dx/ is not a directory
-0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# attempt to move potentially more than one file into a non-existent
-# directory
-abort: with multiple sources, destination must be an existing directory
-# move every file under d1 to d2/d21 (glob)
-moving d1/a to d2/d21/a
-moving d1/b to d2/d21/b
-moving d1/ba to d2/d21/ba
-moving d1/d11/a1 to d2/d21/a1
-A d2/d21/a
-  d1/a
-A d2/d21/a1
-  d1/d11/a1
-A d2/d21/b
-  d1/b
-A d2/d21/ba
-  d1/ba
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move --after some files under d1 to d2/d21 (glob)
-moving d1/a to d2/d21/a
-d1/b: not recording move - d2/d21/b does not exist
-d1/ba: not recording move - d2/d21/ba does not exist
-moving d1/d11/a1 to d2/d21/a1
-A d2/d21/a
-  d1/a
-A d2/d21/a1
-  d1/d11/a1
-R d1/a
-R d1/d11/a1
-2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move every file under d1 starting with an 'a' to d2/d21 (regexp)
-moving d1/a to d2/d21/a
-moving d1/d11/a1 to d2/d21/a1
-A d2/d21/a
-  d1/a
-A d2/d21/a1
-  d1/d11/a1
-R d1/a
-R d1/d11/a1
-2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# attempt to overwrite an existing file
-d1/ca: not overwriting - file exists
-? d1/ca
-0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# forced overwrite of an existing file
-A d1/ca
-  d1/ba
-R d1/ba
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# replace a symlink with a file
-A d1/ca
-  d1/ba
-R d1/ba
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# do not copy more than one source file to the same destination file
-moving d1/d11/a1 to d3/d11/a1
-d3/b: not overwriting - d2/b collides with d1/b
-A d3/a
-  d1/a
-A d3/b
-  d1/b
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move a whole subtree with "hg rename ."
-moving a to ../d3/d1/a
-moving b to ../d3/d1/b
-moving ba to ../d3/d1/ba
-moving d11/a1 to ../d3/d1/d11/a1
-A d3/d1/a
-  d1/a
-A d3/d1/b
-  d1/b
-A d3/d1/ba
-  d1/ba
-A d3/d1/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move a whole subtree with "hg rename --after ."
-moving a to ../d3/a
-moving b to ../d3/b
-moving ba to ../d3/ba
-moving d11/a1 to ../d3/d11/a1
-A d3/a
-  d1/a
-A d3/b
-  d1/b
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# move the parent tree with "hg rename .."
-moving ../a to ../../d3/a
-moving ../b to ../../d3/b
-moving ../ba to ../../d3/ba
-moving a1 to ../../d3/d11/a1
-A d3/a
-  d1/a
-A d3/b
-  d1/b
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# skip removed files
-moving d1/a to d3/a
-moving d1/ba to d3/ba
-moving d1/d11/a1 to d3/d11/a1
-A d3/a
-  d1/a
-A d3/ba
-  d1/ba
-A d3/d11/a1
-  d1/d11/a1
-R d1/a
-R d1/b
-R d1/ba
-R d1/d11/a1
-4 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# transitive rename
-A d1/bc
-  d1/b
-R d1/b
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# transitive rename --after
-A d1/bc
-  d1/b
-R d1/b
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)
-M d1/b
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-# overwriting with renames (issue1959)
-A d1/a
-  d1/b
-A d1/c
-  d1/a
-R d1/b
-diff --git a/d1/b b/d1/a
-rename from d1/b
-rename to d1/a
-diff --git a/d1/a b/d1/c
-copy from d1/a
-copy to d1/c
-2 files updated, 0 files merged, 1 files removed, 0 files unresolved
-# check illegal path components
-abort: path contains illegal component: .hg/foo
-abort: ../foo not under root
-abort: path contains illegal component: .hg/foo
-! d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-abort: path contains illegal component: .hg/a1
-abort: ../a1 not under root
-abort: path contains illegal component: .hg/a1
-! d1/d11/a1
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-abort: path contains illegal component: .hg/foo
-abort: ../../../foo not under root
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rename.t	Mon Aug 30 12:58:43 2010 +0900
@@ -0,0 +1,599 @@
+  $ hg init
+  $ mkdir d1 d1/d11 d2
+  $ echo d1/a > d1/a
+  $ echo d1/ba > d1/ba
+  $ echo d1/a1 > d1/d11/a1
+  $ echo d1/b > d1/b
+  $ echo d2/b > d2/b
+  $ hg add d1/a d1/b d1/ba d1/d11/a1 d2/b
+  $ hg commit -m "1" -d "1000000 0"
+
+rename a single file
+
+  $ hg rename d1/d11/a1 d2/c
+  $ hg sum
+  parent: 0:6f9914c7a010 tip
+   1
+  branch: default
+  commit: 1 renamed
+  update: (current)
+  $ hg status -C
+  A d2/c
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/c
+
+rename --after a single file
+
+  $ mv d1/d11/a1 d2/c
+  $ hg rename --after d1/d11/a1 d2/c
+  $ hg status -C
+  A d2/c
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/c
+
+rename --after a single file when src and tgt already tracked
+
+  $ mv d1/d11/a1 d2/c
+  $ hg addrem -s 0
+  removing d1/d11/a1
+  adding d2/c
+  $ hg rename --after d1/d11/a1 d2/c
+  $ hg status -C
+  A d2/c
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/c
+
+rename --after a single file to a nonexistant target filename
+
+  $ hg rename --after d1/a dummy
+  d1/a: not recording move - dummy does not exist
+
+move a single file to an existing directory
+
+  $ hg rename d1/d11/a1 d2
+  $ hg status -C
+  A d2/a1
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/a1
+
+move --after a single file to an existing directory
+
+  $ mv d1/d11/a1 d2
+  $ hg rename --after d1/d11/a1 d2
+  $ hg status -C
+  A d2/a1
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/a1
+
+rename a file using a relative path
+
+  $ (cd d1/d11; hg rename ../../d2/b e)
+  $ hg status -C
+  A d1/d11/e
+    d2/b
+  R d2/b
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/d11/e
+
+rename --after a file using a relative path
+
+  $ (cd d1/d11; mv ../../d2/b e; hg rename --after ../../d2/b e)
+  $ hg status -C
+  A d1/d11/e
+    d2/b
+  R d2/b
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/d11/e
+
+rename directory d1 as d3
+
+  $ hg rename d1/ d3
+  moving d1/a to d3/a
+  moving d1/b to d3/b
+  moving d1/ba to d3/ba
+  moving d1/d11/a1 to d3/d11/a1
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/b
+    d1/b
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+rename --after directory d1 as d3
+
+  $ mv d1 d3
+  $ hg rename --after d1 d3
+  moving d1/a to d3/a
+  moving d1/b to d3/b
+  moving d1/ba to d3/ba
+  moving d1/d11/a1 to d3/d11/a1
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/b
+    d1/b
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move a directory using a relative path
+
+  $ (cd d2; mkdir d3; hg rename ../d1/d11 d3)
+  moving ../d1/d11/a1 to d3/d11/a1
+  $ hg status -C
+  A d2/d3/d11/a1
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d3
+
+move --after a directory using a relative path
+
+  $ (cd d2; mkdir d3; mv ../d1/d11 d3; hg rename --after ../d1/d11 d3)
+  moving ../d1/d11/a1 to d3/d11/a1
+  $ hg status -C
+  A d2/d3/d11/a1
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d3
+
+move directory d1/d11 to an existing directory d2 (removes empty d1)
+
+  $ hg rename d1/d11/ d2
+  moving d1/d11/a1 to d2/d11/a1
+  $ hg status -C
+  A d2/d11/a1
+    d1/d11/a1
+  R d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d11
+
+move directories d1 and d2 to a new directory d3
+
+  $ mkdir d3
+  $ hg rename d1 d2 d3
+  moving d1/a to d3/d1/a
+  moving d1/b to d3/d1/b
+  moving d1/ba to d3/d1/ba
+  moving d1/d11/a1 to d3/d1/d11/a1
+  moving d2/b to d3/d2/b
+  $ hg status -C
+  A d3/d1/a
+    d1/a
+  A d3/d1/b
+    d1/b
+  A d3/d1/ba
+    d1/ba
+  A d3/d1/d11/a1
+    d1/d11/a1
+  A d3/d2/b
+    d2/b
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  R d2/b
+  $ hg update -C
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move --after directories d1 and d2 to a new directory d3
+
+  $ mkdir d3
+  $ mv d1 d2 d3
+  $ hg rename --after d1 d2 d3
+  moving d1/a to d3/d1/a
+  moving d1/b to d3/d1/b
+  moving d1/ba to d3/d1/ba
+  moving d1/d11/a1 to d3/d1/d11/a1
+  moving d2/b to d3/d2/b
+  $ hg status -C
+  A d3/d1/a
+    d1/a
+  A d3/d1/b
+    d1/b
+  A d3/d1/ba
+    d1/ba
+  A d3/d1/d11/a1
+    d1/d11/a1
+  A d3/d2/b
+    d2/b
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  R d2/b
+  $ hg update -C
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move everything under directory d1 to existing directory d2, do not
+overwrite existing files (d2/b)
+
+  $ hg rename d1/* d2
+  d2/b: not overwriting - file exists
+  moving d1/d11/a1 to d2/d11/a1
+  $ hg status -C
+  A d2/a
+    d1/a
+  A d2/ba
+    d1/ba
+  A d2/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/ba
+  R d1/d11/a1
+  $ diff -u d1/b d2/b
+  --- d1/b	.*
+  \+\+\+ d2/b	.*
+  @@ -1 +1 @@
+  -d1/b
+  +d2/b
+  $ hg update -C
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d2/a d2/ba d2/d11/a1
+
+attempt to move one file into a non-existent directory
+
+  $ hg rename d1/a dx/
+  abort: destination dx/ is not a directory
+  $ hg status -C
+  $ hg update -C
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+attempt to move potentially more than one file into a non-existent directory
+
+  $ hg rename 'glob:d1/**' dx
+  abort: with multiple sources, destination must be an existing directory
+
+move every file under d1 to d2/d21 (glob)
+
+  $ mkdir d2/d21
+  $ hg rename 'glob:d1/**' d2/d21
+  moving d1/a to d2/d21/a
+  moving d1/b to d2/d21/b
+  moving d1/ba to d2/d21/ba
+  moving d1/d11/a1 to d2/d21/a1
+  $ hg status -C
+  A d2/d21/a
+    d1/a
+  A d2/d21/a1
+    d1/d11/a1
+  A d2/d21/b
+    d1/b
+  A d2/d21/ba
+    d1/ba
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d21
+
+move --after some files under d1 to d2/d21 (glob)
+
+  $ mkdir d2/d21
+  $ mv d1/a d1/d11/a1 d2/d21
+  $ hg rename --after 'glob:d1/**' d2/d21
+  moving d1/a to d2/d21/a
+  d1/b: not recording move - d2/d21/b does not exist
+  d1/ba: not recording move - d2/d21/ba does not exist
+  moving d1/d11/a1 to d2/d21/a1
+  $ hg status -C
+  A d2/d21/a
+    d1/a
+  A d2/d21/a1
+    d1/d11/a1
+  R d1/a
+  R d1/d11/a1
+  $ hg update -C
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d21
+
+move every file under d1 starting with an 'a' to d2/d21 (regexp)
+
+  $ mkdir d2/d21
+  $ hg rename 're:d1/([^a][^/]*/)*a.*' d2/d21
+  moving d1/a to d2/d21/a
+  moving d1/d11/a1 to d2/d21/a1
+  $ hg status -C
+  A d2/d21/a
+    d1/a
+  A d2/d21/a1
+    d1/d11/a1
+  R d1/a
+  R d1/d11/a1
+  $ hg update -C
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d2/d21
+
+attempt to overwrite an existing file
+
+  $ echo "ca" > d1/ca
+  $ hg rename d1/ba d1/ca
+  d1/ca: not overwriting - file exists
+  $ hg status -C
+  ? d1/ca
+  $ hg update -C
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+forced overwrite of an existing file
+
+  $ echo "ca" > d1/ca
+  $ hg rename --force d1/ba d1/ca
+  $ hg status -C
+  A d1/ca
+    d1/ba
+  R d1/ba
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/ca
+
+replace a symlink with a file
+
+  $ ln -s ba d1/ca
+  $ hg rename --force d1/ba d1/ca
+  $ hg status -C
+  A d1/ca
+    d1/ba
+  R d1/ba
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/ca
+
+do not copy more than one source file to the same destination file
+
+  $ mkdir d3
+  $ hg rename d1/* d2/* d3
+  moving d1/d11/a1 to d3/d11/a1
+  d3/b: not overwriting - d2/b collides with d1/b
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/b
+    d1/b
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move a whole subtree with \"hg rename .\"
+
+  $ mkdir d3
+  $ (cd d1; hg rename . ../d3)
+  moving a to ../d3/d1/a
+  moving b to ../d3/d1/b
+  moving ba to ../d3/d1/ba
+  moving d11/a1 to ../d3/d1/d11/a1
+  $ hg status -C
+  A d3/d1/a
+    d1/a
+  A d3/d1/b
+    d1/b
+  A d3/d1/ba
+    d1/ba
+  A d3/d1/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move a whole subtree with \"hg rename --after .\"
+
+  $ mkdir d3
+  $ mv d1/* d3
+  $ (cd d1; hg rename --after . ../d3)
+  moving a to ../d3/a
+  moving b to ../d3/b
+  moving ba to ../d3/ba
+  moving d11/a1 to ../d3/d11/a1
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/b
+    d1/b
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+move the parent tree with \"hg rename ..\"
+
+  $ (cd d1/d11; hg rename .. ../../d3)
+  moving ../a to ../../d3/a
+  moving ../b to ../../d3/b
+  moving ../ba to ../../d3/ba
+  moving a1 to ../../d3/d11/a1
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/b
+    d1/b
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+skip removed files
+
+  $ hg remove d1/b
+  $ hg rename d1 d3
+  moving d1/a to d3/a
+  moving d1/ba to d3/ba
+  moving d1/d11/a1 to d3/d11/a1
+  $ hg status -C
+  A d3/a
+    d1/a
+  A d3/ba
+    d1/ba
+  A d3/d11/a1
+    d1/d11/a1
+  R d1/a
+  R d1/b
+  R d1/ba
+  R d1/d11/a1
+  $ hg update -C
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm -rf d3
+
+transitive rename
+
+  $ hg rename d1/b d1/bb
+  $ hg rename d1/bb d1/bc
+  $ hg status -C
+  A d1/bc
+    d1/b
+  R d1/b
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/bc
+
+transitive rename --after
+
+  $ hg rename d1/b d1/bb
+  $ mv d1/bb d1/bc
+  $ hg rename --after d1/bb d1/bc
+  $ hg status -C
+  A d1/bc
+    d1/b
+  R d1/b
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm d1/bc
+
+  $ echo "# idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)"
+  # idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)
+  $ hg rename d1/b d1/bb
+  $ echo "some stuff added to d1/bb" >> d1/bb
+  $ hg rename d1/bb d1/b
+  $ hg status -C
+  M d1/b
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+overwriting with renames (issue1959)
+
+  $ hg rename d1/a d1/c
+  $ hg rename d1/b d1/a
+  $ hg status -C
+  A d1/a
+    d1/b
+  A d1/c
+    d1/a
+  R d1/b
+  $ hg diff --git
+  diff --git a/d1/b b/d1/a
+  rename from d1/b
+  rename to d1/a
+  diff --git a/d1/a b/d1/c
+  copy from d1/a
+  copy to d1/c
+  $ hg update -C
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+check illegal path components
+
+  $ hg rename d1/d11/a1 .hg/foo
+  abort: path contains illegal component: .hg/foo
+  $ hg status -C
+  $ hg rename d1/d11/a1 ../foo
+  abort: ../foo not under root
+  $ hg status -C
+
+  $ mv d1/d11/a1 .hg/foo
+  $ hg rename --after d1/d11/a1 .hg/foo
+  abort: path contains illegal component: .hg/foo
+  $ hg status -C
+  ! d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm .hg/foo
+
+  $ hg rename d1/d11/a1 .hg
+  abort: path contains illegal component: .hg/a1
+  $ hg status -C
+  $ hg rename d1/d11/a1 ..
+  abort: ../a1 not under root
+  $ hg status -C
+
+  $ mv d1/d11/a1 .hg
+  $ hg rename --after d1/d11/a1 .hg
+  abort: path contains illegal component: .hg/a1
+  $ hg status -C
+  ! d1/d11/a1
+  $ hg update -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm .hg/a1
+
+  $ (cd d1/d11; hg rename ../../d2/b ../../.hg/foo)
+  abort: path contains illegal component: .hg/foo
+  $ hg status -C
+  $ (cd d1/d11; hg rename ../../d2/b ../../../foo)
+  abort: ../../../foo not under root
+  $ hg status -C
+