[PATCH 13 of 13 STABLE V4] merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Sun Dec 18 09:55:52 CST 2011
At Fri, 16 Dec 2011 19:04:18 -0600,
Matt Mackall wrote:
>
> On Fri, 2011-12-16 at 21:27 +0900, FUJIWARA Katsunori wrote:
> > # HG changeset patch
> > # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> > # Date 1324038087 -32400
> > # Branch stable
> > # Node ID ccc9aa6a0b1bf1d7def794aabcd09cb258001991
> > # Parent 08fc03db973623b6fd176f810f20f35851b55918
> > merge: check filename case collision between changesets for branch merging
>
> Ok, I've queued all your patches for stable except 7, 9, and 12 which I
> need to think about some more first.
Thank you for acceptance !
If current 7 is rejected, we should do some other care for
"util.fspath()" to preserve case of filenames missed in cache.
This problem can be reproduced on any case insensitive filesystems by
below patch.
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1324222301 -32400
# Branch stable
# Node ID ee0037d72edcee59518c5185e7a3a17ff2c75ec3
# Parent d550168f11ce80e62caaff18b6c29ec1477b8803
icasefs: use case-mixed filenames to test case preservation in mq operations
on case insensitive filesystem, files newly created by "hg qpush"
sometimes invalidate filename cache "_fspathcache" used in
"util.fspath()", because "hg qpush" may create new file under
directory where filenames are already cached into "_fspathcache".
in such situation, "util.fspath()" called from normalization in
dirstate returns already normcase()-ed path, and causes unexpected
behavior on mixed case or opposite case to normcase()-ing filenames.
this patch changes name of some files to mixed case one, to check
whether case of filename is correctly preserved in dirstate
normalization with "util.fspath()".
diff -r d550168f11ce -r ee0037d72edc tests/test-mq.t
--- a/tests/test-mq.t Fri Dec 16 21:21:27 2011 +0900
+++ b/tests/test-mq.t Mon Dec 19 00:31:41 2011 +0900
@@ -139,17 +139,20 @@
[255]
$ cd ..
+some files are named as mixed-case (e.g.: Foo, Bar), to test case
+preservation on case insensitive filesystem.
+
$ echo '% qinit; <stuff>; qinit -c'
% qinit; <stuff>; qinit -c
$ hg init e
$ cd e
$ hg qnew A
$ checkundo qnew
- $ echo foo > foo
- $ hg add foo
+ $ echo foo > Foo
+ $ hg add Foo
$ hg qrefresh
$ hg qnew B
- $ echo >> foo
+ $ echo >> Foo
$ hg qrefresh
$ echo status >> .hg/patches/.hgignore
$ echo bleh >> .hg/patches/.hgignore
@@ -813,27 +816,27 @@
$ cd ..
$ hg qrefresh
$ hg qnew -mbar bar
- $ echo foo > foo
- $ echo bar > bar
- $ hg add foo bar
+ $ echo foo > Foo
+ $ echo bar > Bar
+ $ hg add Foo Bar
$ hg qrefresh
$ hg qpop -a
popping bar
popping foo
patch queue now empty
- $ echo bar > foo
+ $ echo bar > Foo
$ hg qpush -a
applying foo
applying bar
- file foo already exists
- 1 out of 1 hunks FAILED -- saving rejects to file foo.rej
+ file Foo already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file Foo.rej
patch failed, unable to continue (try -v)
patch failed, rejects left in working dir
errors during apply, please fix and refresh bar
[2]
$ hg st
- ? foo
- ? foo.rej
+ ? Foo
+ ? Foo.rej
mq tags
@@ -950,67 +953,67 @@
$ hg init slow
$ cd slow
$ hg qinit
- $ echo foo > foo
- $ hg add foo
+ $ echo foo > Foo
+ $ hg add Foo
$ hg ci -m 'add foo'
$ hg qnew bar
- $ echo bar > bar
- $ hg add bar
- $ hg mv foo baz
+ $ echo bar > Bar
+ $ hg add Bar
+ $ hg mv Foo baz
$ hg qrefresh --git
$ hg up -C 0
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
- $ echo >> foo
+ $ echo >> Foo
$ hg ci -m 'change foo'
created new head
$ hg up -C 1
2 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg qrefresh --git
$ cat .hg/patches/bar
- diff --git a/bar b/bar
+ diff --git a/Bar b/Bar
new file mode 100644
--- /dev/null
- +++ b/bar
+ +++ b/Bar
@@ -0,0 +1,1 @@
+bar
- diff --git a/foo b/baz
- rename from foo
+ diff --git a/Foo b/baz
+ rename from Foo
rename to baz
$ hg log -v --template '{rev} {file_copies}\n' -r .
- 2 baz (foo)
+ 2 baz (Foo)
$ hg qrefresh --git
$ cat .hg/patches/bar
- diff --git a/bar b/bar
+ diff --git a/Bar b/Bar
new file mode 100644
--- /dev/null
- +++ b/bar
+ +++ b/Bar
@@ -0,0 +1,1 @@
+bar
- diff --git a/foo b/baz
- rename from foo
+ diff --git a/Foo b/baz
+ rename from Foo
rename to baz
$ hg log -v --template '{rev} {file_copies}\n' -r .
- 2 baz (foo)
+ 2 baz (Foo)
$ hg qrefresh
$ grep 'diff --git' .hg/patches/bar
- diff --git a/bar b/bar
- diff --git a/foo b/baz
+ diff --git a/Bar b/Bar
+ diff --git a/Foo b/baz
test file move chains in the slow path
$ hg up -C 1
1 files updated, 0 files merged, 2 files removed, 0 files unresolved
- $ echo >> foo
+ $ echo >> Foo
$ hg ci -m 'change foo again'
$ hg up -C 2
2 files updated, 0 files merged, 1 files removed, 0 files unresolved
- $ hg mv bar quux
+ $ hg mv Bar quux
$ hg mv baz bleh
$ hg qrefresh --git
$ cat .hg/patches/bar
- diff --git a/foo b/bleh
- rename from foo
+ diff --git a/Foo b/bleh
+ rename from Foo
rename to bleh
diff --git a/quux b/quux
new file mode 100644
@@ -1019,13 +1022,13 @@
@@ -0,0 +1,1 @@
+bar
$ hg log -v --template '{rev} {file_copies}\n' -r .
- 3 bleh (foo)
+ 3 bleh (Foo)
$ hg mv quux fred
$ hg mv bleh barney
$ hg qrefresh --git
$ cat .hg/patches/bar
- diff --git a/foo b/barney
- rename from foo
+ diff --git a/Foo b/barney
+ rename from Foo
rename to barney
diff --git a/fred b/fred
new file mode 100644
@@ -1034,7 +1037,7 @@
@@ -0,0 +1,1 @@
+bar
$ hg log -v --template '{rev} {file_copies}\n' -r .
- 3 barney (foo)
+ 3 barney (Foo)
refresh omitting an added file
@@ -1103,42 +1106,42 @@
$ cd ..
$ hg init strip
$ cd strip
- $ touch foo
- $ hg add foo
+ $ touch Foo
+ $ hg add Foo
$ hg ci -m 'add foo'
- $ echo >> foo
+ $ echo >> Foo
$ hg ci -m 'change foo 1'
$ hg up -C 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
- $ echo 1 >> foo
+ $ echo 1 >> Foo
$ hg ci -m 'change foo 2'
created new head
$ HGMERGE=true hg merge
- merging foo
+ merging Foo
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m merge
$ hg log
- changeset: 3:99615015637b
+ changeset: 3:072ab4d9074d
tag: tip
- parent: 2:20cbbe65cff7
- parent: 1:d2871fc282d4
+ parent: 2:66bb725413f8
+ parent: 1:ed93cfd3c638
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: merge
- changeset: 2:20cbbe65cff7
- parent: 0:53245c60e682
+ changeset: 2:66bb725413f8
+ parent: 0:fc0ec5a99727
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change foo 2
- changeset: 1:d2871fc282d4
+ changeset: 1:ed93cfd3c638
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change foo 1
- changeset: 0:53245c60e682
+ changeset: 0:fc0ec5a99727
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add foo
@@ -1148,13 +1151,13 @@
saved backup bundle to $TESTTMP/b/strip/.hg/strip-backup/*-backup.hg (glob)
$ checkundo strip
$ hg log
- changeset: 1:20cbbe65cff7
+ changeset: 1:66bb725413f8
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change foo 2
- changeset: 0:53245c60e682
+ changeset: 0:fc0ec5a99727
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add foo
@@ -1173,12 +1176,12 @@
> }
$ hg init qclonesource
$ cd qclonesource
- $ echo foo > foo
- $ hg add foo
+ $ echo foo > Foo
+ $ hg add Foo
$ hg ci -m 'add foo'
$ hg qinit
$ hg qnew patch1
- $ echo bar >> foo
+ $ echo bar >> Foo
$ hg qrefresh -m 'change foo'
$ cd ..
More information about the Mercurial-devel
mailing list