changeset 15538:b0a88bda3381 stable

update: don't clobber untracked files with wrong casing
author Mads Kiilerich <mads@kiilerich.com>
date Sun, 20 Nov 2011 23:09:32 +0100
parents 415d69df8a02
children 49a5db5b10de f76584098c88
files mercurial/merge.py tests/test-casefolding.t
diffstat 2 files changed, 30 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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 ..