[PATCH 4 of 6 STABLE V3] merge: check filename case collision between merged changesets

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Mon Dec 12 07:25:40 CST 2011


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1323677419 -32400
# Branch stable
# Node ID 34aba3511c68823a927bf5957f813ae0d3dd4214
# Parent  d7229f60ad8aacd657d780935235a84048413dc6
merge: check filename case collision between merged changesets

this patch makes merge abort when merged changesets have same file in
different case on case insensitive filesystem.

diff -r d7229f60ad8a -r 34aba3511c68 mercurial/merge.py
--- a/mercurial/merge.py	Mon Dec 12 17:10:19 2011 +0900
+++ b/mercurial/merge.py	Mon Dec 12 17:10:19 2011 +0900
@@ -96,7 +96,7 @@
             raise util.Abort(_("untracked file in working directory differs"
                                " from file in requested revision: '%s'") % fn)
 
-def _checkcollision(mctx):
+def _checkcollision(mctx, wctx):
     "check for case folding collisions in the destination context"
     folded = {}
     for fn in mctx:
@@ -106,6 +106,13 @@
                              % (fn, folded[fold]))
         folded[fold] = fn
 
+    for fn in (wctx or []):
+        fold = util.normcase(fn)
+        mfn = folded.get(fold, None)
+        if mfn and (mfn != fn):
+            raise util.Abort(_("case-folding collision between %s and %s")
+                             % (mfn, fn))
+
 def _forgetremoved(wctx, mctx, branchmerge):
     """
     Forget removed files
@@ -549,7 +556,7 @@
         if not force:
             _checkunknown(wc, p2, folding)
         if folding:
-            _checkcollision(p2)
+            _checkcollision(p2, branchmerge and p1)
         action += _forgetremoved(wc, p2, branchmerge)
         action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
 
diff -r d7229f60ad8a -r 34aba3511c68 tests/test-casecollision-merge.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-casecollision-merge.t	Mon Dec 12 17:10:19 2011 +0900
@@ -0,0 +1,37 @@
+run only on case-insensitive filesystems
+
+  $ "$TESTDIR/hghave" icasefs || exit 80
+
+create base revision
+
+  $ hg init repo
+  $ cd repo
+  $ echo base > base.txt
+  $ hg add base.txt
+  $ hg commit -m 'base'
+
+add same file in different case on both heads
+
+  $ echo a > a.txt
+  $ hg add a.txt
+  $ hg commit -m 'add a.txt'
+
+  $ hg update 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+  $ echo A > A.TXT
+  $ hg add A.TXT
+  $ hg commit -m 'add A.TXT'
+  created new head
+
+merge another, and fail with case-folding collision
+
+  $ hg merge
+  abort: case-folding collision between a.txt and A.TXT
+  [255]
+
+check clean-ness of working directory
+
+  $ hg status
+  $ hg parents --template '{rev}\n'
+  2


More information about the Mercurial-devel mailing list