##// END OF EJS Templates
wireprotov2: implement commands as a generator of objects...
wireprotov2: implement commands as a generator of objects Previously, wire protocol version 2 inherited version 1's model of having separate types to represent the results of different wire protocol commands. As I implemented more powerful commands in future commits, I found I was using a common pattern of returning a special type to hold a generator. This meant the command function required a closure to do most of the work. That made logic flow more difficult to follow. I also noticed that many commands were effectively a sequence of objects to be CBOR encoded. I think it makes sense to define version 2 commands as generators. This way, commands can simply emit the data structures they wish to send to the client. This eliminates the need for a closure in command functions and removes encoding from the bodies of commands. As part of this commit, the handling of response objects has been moved into the serverreactor class. This puts the reactor in the driver's seat with regards to CBOR encoding and error handling. Having error handling in the function that emits frames is particularly important because exceptions in that function can lead to things getting in a bad state: I'm fairly certain that uncaught exceptions in the frame generator were causing deadlocks. I also introduced a dedicated error type for explicit error reporting in command handlers. This will be used in subsequent commits. There's still a bit of work to be done here, especially around formalizing the error handling "protocol." I've added yet another TODO to track this so we don't forget. Test output changed because we're using generators and no longer know we are at the end of the data until we hit the end of the generator. This means we can't emit the end-of-stream flag until we've exhausted the generator. Hence the introduction of 0-sized end-of-stream frames. Differential Revision: https://phab.mercurial-scm.org/D4472

File last commit:

r39386:5b92a717 default
r39595:07b58266 default
Show More
test-rename.t
698 lines | 15.1 KiB | text/troff | Tads3Lexer
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin Geisler
tests: remove unneeded -d flags...
r12156 $ hg commit -m "1"
Nicolas Dumazet
tests: unify test-rename
r12098
rename a single file
$ hg rename d1/d11/a1 d2/c
Adrian Buehlmann
add: introduce a warning message for non-portable filenames (issue2756) (BC)...
r13962 $ hg --config ui.portablefilenames=abort rename d1/a d1/con.xml
Augie Fackler
scmutil: use util.shellquote instead of %r...
r33795 abort: filename contains 'con', which is reserved on Windows: d1/con.xml
Adrian Buehlmann
add: introduce a warning message for non-portable filenames (issue2756) (BC)...
r13962 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg sum
Martin Geisler
tests: remove unneeded -d flags...
r12156 parent: 0:9b4b6e7b2c26 tip
Nicolas Dumazet
tests: unify test-rename
r12098 1
branch: default
commit: 1 renamed
update: (current)
Gilles Moris
summary: move the parents phase marker to commit line (issue4688)...
r25382 phases: 1 draft
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin Geisler
test-rename: test with absolute paths
r12898 rename a single file using absolute paths
$ hg rename `pwd`/d1/d11/a1 `pwd`/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
Nicolas Dumazet
tests: unify test-rename
r12098 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
timeless@mozdev.org
spelling: nonexistent
r17492 rename --after a single file to a nonexistent target filename
Nicolas Dumazet
tests: unify test-rename
r12098
$ hg rename --after d1/a dummy
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 d1/a: not recording move - dummy does not exist
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Nicolas Dumazet
tests: unify test-rename
r12098
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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving ../d1/d11/a1 to d3/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving ../d1/d11/a1 to d3/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d1/d11/a1 to d2/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Augie Fackler
copy: distinguish "file exists" cases and add a hint (BC)...
r30151 d2/b: not overwriting - file already committed
Martin von Zweigbergk
rename: quote hg commands in warnings...
r39384 ('hg rename --force' to replace the file by recording a rename)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d1/d11/a1 to d2/d11/a1
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Brodie Rao
tests: add glob matching for unified tests...
r12376 --- d1/b * (glob)
+++ d2/b * (glob)
Mads Kiilerich
test-rename: accept solaris diff...
r12405 @@ * (glob)
Nicolas Dumazet
tests: unify test-rename
r12098 -d1/b
+d2/b
Matt Mackall
tests: add exit codes to unified tests
r12316 [1]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 move every file under d1 to d2/d21
Nicolas Dumazet
tests: unify test-rename
r12098
$ mkdir d2/d21
$ hg rename 'glob:d1/**' d2/d21
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 move --after some files under d1 to d2/d21
Nicolas Dumazet
tests: unify test-rename
r12098
$ mkdir d2/d21
$ mv d1/a d1/d11/a1 d2/d21
$ hg rename --after 'glob:d1/**' d2/d21
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 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
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d1/a to d2/d21/a
moving d1/d11/a1 to d2/d21/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin von Zweigbergk
rename: quote hg commands in warnings...
r39384 ('hg rename --after' to record the rename)
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Patrick Mezard
Merge with stable
r12345 attempt to overwrite an existing broken symlink
Adrian Buehlmann
test-rename.t: enable for Windows
r16902 #if symlink
Patrick Mezard
Merge with stable
r12345 $ ln -s ba d1/ca
$ hg rename --traceback d1/ba d1/ca
d1/ca: not overwriting - file exists
Martin von Zweigbergk
rename: quote hg commands in warnings...
r39384 ('hg rename --after' to record the rename)
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Patrick Mezard
Merge with stable
r12345 $ hg status -C
? d1/ca
$ hg update -C
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ rm d1/ca
Nicolas Dumazet
tests: unify test-rename
r12098 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
Adrian Buehlmann
test-rename.t: enable for Windows
r16902 #endif
Nicolas Dumazet
tests: unify test-rename
r12098
do not copy more than one source file to the same destination file
$ mkdir d3
$ hg rename d1/* d2/* d3
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d1/d11/a1 to d3/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 d3/b: not overwriting - d2/b collides with d1/b
Martin von Zweigbergk
rename: return error status if any rename/copy failed...
r39386 [1]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin Geisler
test-rename: fix \" -> " in comments
r12897 move a whole subtree with "hg rename ."
Nicolas Dumazet
tests: unify test-rename
r12098
$ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d11/a1 to ../d3/d1/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin Geisler
test-rename: fix \" -> " in comments
r12897 move a whole subtree with "hg rename --after ."
Nicolas Dumazet
tests: unify test-rename
r12098
$ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d11/a1 to ../d3/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Martin Geisler
test-rename: fix \" -> " in comments
r12897 move the parent tree with "hg rename .."
Nicolas Dumazet
tests: unify test-rename
r12098
$ (cd d1/d11; hg rename .. ../../d3)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving ../a to ../../d3/a
moving ../b to ../../d3/b
moving ../ba to ../../d3/ba
Nicolas Dumazet
tests: unify test-rename
r12098 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 moving d1/a to d3/a
moving d1/ba to d3/ba
moving d1/d11/a1 to d3/d11/a1
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Pierre-Yves David
rename: properly report removed and added file as modified (issue4458)...
r23402 M d1/a
Nicolas Dumazet
tests: unify test-rename
r12098 d1/b
A d1/c
d1/a
R d1/b
$ hg diff --git
Pierre-Yves David
rename: properly report removed and added file as modified (issue4458)...
r23402 diff --git a/d1/a b/d1/a
--- a/d1/a
+++ b/d1/a
@@ -1,1 +1,1 @@
-d1/a
+d1/b
diff --git a/d1/b b/d1/b
deleted file mode 100644
--- a/d1/b
+++ /dev/null
@@ -1,1 +0,0 @@
-d1/b
Nicolas Dumazet
tests: unify test-rename
r12098 diff --git a/d1/a b/d1/c
copy from d1/a
copy to d1/c
$ hg update -C
Pierre-Yves David
manifest: fix a bug where working copy file 'add' mark was buggy...
r23401 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ rm d1/c # The file was marked as added, so 'hg update' action was 'forget'
Nicolas Dumazet
tests: unify test-rename
r12098
check illegal path components
$ hg rename d1/d11/a1 .hg/foo
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/foo
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
$ hg rename d1/d11/a1 ../foo
Mads Kiilerich
scmutil: localize and improve 'not under root' message
r18450 abort: ../foo not under root '$TESTTMP'
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
$ mv d1/d11/a1 .hg/foo
$ hg rename --after d1/d11/a1 .hg/foo
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/foo
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/a1
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006 $ hg --config extensions.largefiles= rename d1/d11/a1 .hg
FUJIWARA Katsunori
tests: add fsmonitor specific output lines at enabling largefiles...
r33209 The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/a1
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
$ hg rename d1/d11/a1 ..
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: ../a1 not under root '$TESTTMP'
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006 $ hg --config extensions.largefiles= rename d1/d11/a1 ..
FUJIWARA Katsunori
tests: add fsmonitor specific output lines at enabling largefiles...
r33209 The fsmonitor extension is incompatible with the largefiles extension and has been disabled. (fsmonitor !)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: ../a1 not under root '$TESTTMP'
Matt Harbison
largefiles: use the core file copy logic to validate the destination path...
r24006 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
$ mv d1/d11/a1 .hg
$ hg rename --after d1/d11/a1 .hg
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/a1
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ 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)
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 abort: path contains illegal component: .hg/foo
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
$ (cd d1/d11; hg rename ../../d2/b ../../../foo)
Mads Kiilerich
scmutil: localize and improve 'not under root' message
r18450 abort: ../../../foo not under root '$TESTTMP'
Matt Mackall
tests: add exit codes to unified tests
r12316 [255]
Nicolas Dumazet
tests: unify test-rename
r12098 $ hg status -C
Kyle Lippincott
copyfile: preserve stat info (mtime, etc.) when doing copies/renames...
r37106 check that stat information such as mtime is preserved on rename - it's unclear
whether the `touch` and `stat` commands are portable, so we mimic them using
python. Not all platforms support precision of even one-second granularity, so
we allow a rather generous fudge factor here; 1234567890 is 2009, and the
primary thing we care about is that it's not the machine's current time;
hopefully it's really unlikely for a machine to have such a broken clock that
this test fails. :)
$ mkdir mtime
Create the file (as empty), then update its mtime and atime to be 1234567890.
>>> import os
>>> filename = "mtime/f"
>>> mtime = 1234567890
>>> open(filename, "w").close()
>>> os.utime(filename, (mtime, mtime))
$ hg ci -qAm 'add mtime dir'
"hg cp" does not preserve the mtime, so it should be newer than the 2009
timestamp.
$ hg cp -q mtime mtime_cp
>>> from __future__ import print_function
>>> import os
>>> filename = "mtime_cp/f"
>>> print(os.stat(filename).st_mtime < 1234567999)
False
"hg mv" preserves the mtime, so it should be ~equal to the 2009 timestamp
(modulo some fudge factor due to not every system supporting 1s-level
precision).
$ hg mv -q mtime mtime_mv
>>> from __future__ import print_function
>>> import os
>>> filename = "mtime_mv/f"
>>> print(os.stat(filename).st_mtime < 1234567999)
True