dirstate: eliminate reference cycle from normalize
authorMatt Mackall <mpm@selenic.com>
Mon, 08 Jun 2009 18:14:44 -0500
changeset 8732 3507f6c7715c
parent 8731 f037187a6f68
child 8733 f8be48c6b08c
dirstate: eliminate reference cycle from normalize Bound methods hold a reference to self, so assigning a bound method to an instance unavoidably creates a cycle. Work around this by choosing a normalize method at walk time instead. Eliminate default arg while we're at it.
mercurial/dirstate.py
--- a/mercurial/dirstate.py	Sun Jun 07 21:16:05 2009 +0200
+++ b/mercurial/dirstate.py	Mon Jun 08 18:14:44 2009 -0500
@@ -114,12 +114,6 @@
     def _checkcase(self):
         return not util.checkcase(self._join('.hg'))
 
-    @propertycache
-    def normalize(self):
-        if self._checkcase:
-            return self._normalize
-        return lambda x, y=False: x
-
     def _join(self, f):
         # much faster than os.path.join()
         # it's safe because f is always a relative path
@@ -345,7 +339,7 @@
         except KeyError:
             self._ui.warn(_("not in dirstate: %s\n") % f)
 
-    def _normalize(self, path, knownpath=False):
+    def _normalize(self, path, knownpath):
         norm_path = os.path.normcase(path)
         fold_path = self._foldmap.get(norm_path, None)
         if fold_path is None:
@@ -450,7 +444,6 @@
         badfn = match.bad
         dmap = self._map
         normpath = util.normpath
-        normalize = self.normalize
         listdir = osutil.listdir
         lstat = os.lstat
         getkind = stat.S_IFMT
@@ -461,6 +454,11 @@
         work = []
         wadd = work.append
 
+        if self._checkcase:
+            normalize = self._normalize
+        else:
+            normalize = lambda x, y: x
+
         exact = skipstep3 = False
         if matchfn == match.exact: # match.exact
             exact = True
@@ -475,7 +473,7 @@
 
         # step 1: find all explicit files
         for ff in sorted(files):
-            nf = normalize(normpath(ff))
+            nf = normalize(normpath(ff), True)
             if nf in results:
                 continue