# HG changeset patch # User Matt Mackall # Date 1244502884 18000 # Node ID 3507f6c7715ca7016c3276ec9450b645bfa4b435 # Parent f037187a6f685f6e8242b81d4221bf5e73ea1036 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. diff -r f037187a6f68 -r 3507f6c7715c 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