# HG changeset patch # User Mads Kiilerich # Date 1321826972 -3600 # Node ID b0a88bda3381a04f2294d9fdcf9101283b62c006 # Parent 415d69df8a02d3ad0411c9183d58a84ee311f32b update: don't clobber untracked files with wrong casing diff -r 415d69df8a02 -r b0a88bda3381 mercurial/merge.py --- 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) diff -r 415d69df8a02 -r b0a88bda3381 tests/test-casefolding.t --- 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 ..