--- a/mercurial/merge.py Sun Nov 20 16:06:51 2011 -0600
+++ b/mercurial/merge.py Sun Nov 20 23:09:32 2011 +0100
@@ -81,12 +81,20 @@
self.mark(dfile, 'r')
return r
-def _checkunknown(wctx, mctx):
+def _checkunknown(wctx, mctx, folding):
"check for collisions between unknown files and files in mctx"
- for f in wctx.unknown():
- if f in mctx and mctx[f].cmp(wctx[f]):
+ if folding:
+ foldf = util.normcase
+ else:
+ foldf = lambda fn: fn
+ folded = {}
+ for fn in mctx:
+ folded[foldf(fn)] = fn
+ for fn in wctx.unknown():
+ f = foldf(fn)
+ if f in folded and mctx[folded[f]].cmp(wctx[f]):
raise util.Abort(_("untracked file in working directory differs"
- " from file in requested revision: '%s'") % f)
+ " from file in requested revision: '%s'") % fn)
def _checkcollision(mctx):
"check for case folding collisions in the destination context"
@@ -537,9 +545,10 @@
### calculate phase
action = []
wc.status(unknown=True) # prime cache
+ folding = not util.checkcase(repo.path)
if not force:
- _checkunknown(wc, p2)
- if not util.checkcase(repo.path):
+ _checkunknown(wc, p2, folding)
+ if folding:
_checkcollision(p2)
action += _forgetremoved(wc, p2, branchmerge)
action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
--- a/tests/test-casefolding.t Sun Nov 20 16:06:51 2011 -0600
+++ b/tests/test-casefolding.t Sun Nov 20 23:09:32 2011 +0100
@@ -1,5 +1,8 @@
$ "$TESTDIR/hghave" icasefs || exit 80
+ $ hg debugfs | grep 'case-sensitive:'
+ case-sensitive: no
+
test file addition with bad case
$ hg init repo1
@@ -56,4 +59,16 @@
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg up -C
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+no clobbering of untracked files with wrong casing
+
+ $ hg up -r null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo gold > a
+ $ hg up
+ abort: untracked file in working directory differs from file in requested revision: 'a'
+ [255]
+ $ cat a
+ gold
+
$ cd ..