dirstate: normalize case of directory components

If we have an existing f/a, and rename f to F, adding F/b should be
normalized to f/b.
This commit is contained in:
Matt Mackall 2012-03-28 19:24:13 -05:00
parent 76e8b41818
commit b7a9e07a8c

View File

@ -82,6 +82,8 @@ class dirstate(object):
f = {} f = {}
for name in self._map: for name in self._map:
f[util.normcase(name)] = name f[util.normcase(name)] = name
for name in self._dirs:
f[util.normcase(name)] = name
f['.'] = '.' # prevents useless util.fspath() invocation f['.'] = '.' # prevents useless util.fspath() invocation
return f return f
@ -401,8 +403,16 @@ class dirstate(object):
if isknown or not os.path.lexists(os.path.join(self._root, path)): if isknown or not os.path.lexists(os.path.join(self._root, path)):
folded = path folded = path
else: else:
folded = self._foldmap.setdefault(normed, # recursively normalize leading directory components
util.fspath(normed, self._root)) # against dirstate
if '/' in normed:
d, f = normed.rsplit('/')
d = self._root + "/" + self._normalize(d, isknown)
folded = d + "/" + util.fspath(f, d)
else:
folded = util.fspath(normed, self._root)
self._foldmap[normed] = folded
return folded return folded
def normalize(self, path, isknown=False): def normalize(self, path, isknown=False):