--- /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
+