diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -2383,7 +2383,7 @@ def push(ui, repo, patch=None, **opts): When -f/--force is applied, all local changes in patched files will be lost. - Return 0 on succces. + Return 0 on success. """ q = repo.mq mergeq = None diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -375,16 +375,34 @@ class dirstate(object): self._ui.warn(_("not in dirstate: %s\n") % f) self._lastnormal.discard(f) - def _normalize(self, path, knownpath): - norm_path = os.path.normcase(path) - fold_path = self._foldmap.get(norm_path, None) - if fold_path is None: - if knownpath or not os.path.lexists(os.path.join(self._root, path)): - fold_path = path + def _normalize(self, path, isknown): + normed = os.path.normcase(path) + folded = self._foldmap.get(normed, None) + if folded is None: + if isknown or not os.path.lexists(os.path.join(self._root, path)): + folded = path else: - fold_path = self._foldmap.setdefault(norm_path, + folded = self._foldmap.setdefault(normed, util.fspath(path, self._root)) - return fold_path + return folded + + def normalize(self, path, isknown=False): + ''' + normalize the case of a pathname when on a casefolding filesystem + + isknown specifies whether the filename came from walking the + disk, to avoid extra filesystem access + + The normalized case is determined based on the following precedence: + + - version of name already stored in the dirstate + - version of name stored on disk + - version provided via command arguments + ''' + + if self._checkcase: + return self._normalize(path, isknown) + return path def clear(self): self._map = {} diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -338,7 +338,8 @@ def applyupdates(repo, action, wctx, mct else: merged += 1 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags) - if f != fd and move and os.path.lexists(repo.wjoin(f)): + if (move and repo.dirstate.normalize(fd) != f + and os.path.lexists(repo.wjoin(f))): repo.ui.debug("removing %s\n" % f) os.unlink(repo.wjoin(f)) elif m == "g": # get