changeset 13717:bc41d08a5ccc stable

dirstate: introduce a public case normalizing method
author Matt Mackall <mpm@selenic.com>
date Tue, 22 Mar 2011 11:59:43 -0500
parents a083c6e62acb
children 5b3383ea67d2
files mercurial/dirstate.py
diffstat 1 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dirstate.py	Fri Mar 18 11:36:36 2011 -0500
+++ b/mercurial/dirstate.py	Tue Mar 22 11:59:43 2011 -0500
@@ -362,16 +362,34 @@
         except KeyError:
             self._ui.warn(_("not in dirstate: %s\n") % 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 = {}