dirstate: fix some problems for recursive case normalization (issue3342) stable
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sat, 31 Mar 2012 15:55:03 +0900
branchstable
changeset 16323 0789d1bbf6c1
parent 16322 ba96dd4655a0
child 16325 740f20e252bd
dirstate: fix some problems for recursive case normalization (issue3342) file in nested directory causes unexpected abort. problems below should be fixed for recursive normalization route in dirstate._normalize(): 1. rsplit() may cause unpacking into more than 2 elements. it should be called with 'maxsplit' argument to unpack into 'd, f' 2. 'd' is replaced by normalized value prefixed with 'self._root', but this makes 'folded' as absolute path, and it is unexpected one for caller of recursive normalization
mercurial/dirstate.py
tests/test-casefolding.t
--- a/mercurial/dirstate.py	Sat Mar 31 10:44:31 2012 -0500
+++ b/mercurial/dirstate.py	Sat Mar 31 15:55:03 2012 +0900
@@ -406,9 +406,10 @@
                 # recursively normalize leading directory components
                 # against dirstate
                 if '/' in normed:
-                    d, f = normed.rsplit('/')
-                    d = self._root + "/" + self._normalize(d, isknown)
-                    folded = d + "/" + util.fspath(f, d)
+                    d, f = normed.rsplit('/', 1)
+                    d = self._normalize(d, isknown)
+                    r = self._root + "/" + d
+                    folded = d + "/" + util.fspath(f, r)
                 else:
                     folded = util.fspath(normed, self._root)
                 self._foldmap[normed] = folded
--- a/tests/test-casefolding.t	Sat Mar 31 10:44:31 2012 -0500
+++ b/tests/test-casefolding.t	Sat Mar 31 15:55:03 2012 +0900
@@ -73,6 +73,17 @@
 
   $ cd ..
 
+issue 3342: file in nested directory causes unexpected abort
+
+  $ hg init issue3342
+  $ cd issue3342
+
+  $ mkdir -p a/B/c/D
+  $ echo e > a/B/c/D/e
+  $ hg add a/B/c/D/e
+
+  $ cd ..
+
 issue 3340: mq does not handle case changes correctly
 
 in addition to reported case, 'hg qrefresh' is also tested against