[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