[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