[PATCH 2 of 3] store: eliminate reference cycle in fncachestore

Simon Heimberg simohe at besonet.ch
Mon Jul 13 09:15:00 CDT 2009


# HG changeset patch
# User Simon Heimberg <simohe at besonet.ch>
# Date 1247241244 -7200
# Node ID d0d02a480e6a65cac1c86f7e74445c3e71ed173a
# Parent  a9ab0e06c244d08c1308b843d8b3385e9051788e
store: eliminate reference cycle in fncachestore

override method instead of passing a bound method
pass defversion in store because it is not possible to add a property to a
method

diff -r a9ab0e06c244 -r d0d02a480e6a mercurial/localrepo.py
--- a/mercurial/localrepo.py	Don Jul 09 13:23:27 2009 +0200
+++ b/mercurial/localrepo.py	Fre Jul 10 17:54:04 2009 +0200
@@ -106,7 +106,7 @@
             p = os.environ['HG_PENDING']
             if p.startswith(self.root):
                 c.readpending('00changelog.i.a')
-        self.sopener.defversion = c.version
+        self.store.defversion = c.version
         return c
 
     @propertycache
diff -r a9ab0e06c244 -r d0d02a480e6a mercurial/revlog.py
--- a/mercurial/revlog.py	Don Jul 09 13:23:27 2009 +0200
+++ b/mercurial/revlog.py	Fre Jul 10 17:54:04 2009 +0200
@@ -430,11 +430,12 @@
         self.nodemap = {nullid: nullrev}
         self.index = []
 
-        v = REVLOG_DEFAULT_VERSION
-        if hasattr(opener, "defversion"):
-            v = opener.defversion
+        try:
+            v = opener.im_self.defversion
             if v & REVLOGNG:
                 v |= REVLOGNGINLINEDATA
+        except AttributeError:
+            v = REVLOG_DEFAULT_VERSION
 
         i = ''
         try:
diff -r a9ab0e06c244 -r d0d02a480e6a mercurial/store.py
--- a/mercurial/store.py	Don Jul 09 13:23:27 2009 +0200
+++ b/mercurial/store.py	Fre Jul 10 17:54:04 2009 +0200
@@ -171,9 +171,11 @@
         self.pathjoiner = pathjoiner
         self.path = path
         self.createmode = _calcmode(path)
-        op = opener(self.path)
-        op.createmode = self.createmode
-        self.opener = lambda f, *args, **kw: op(encodedir(f), *args, **kw)
+        self._opener = opener(self.path)
+        self._opener.createmode = self.createmode
+
+    def opener(self, name, *args, **kw):
+        return self._opener(encodedir(name), *args, **kw)
 
     def join(self, f):
         return self.pathjoiner(self.path, encodedir(f))
@@ -216,9 +218,11 @@
         self.pathjoiner = pathjoiner
         self.path = self.pathjoiner(path, 'store')
         self.createmode = _calcmode(self.path)
-        op = opener(self.path)
-        op.createmode = self.createmode
-        self.opener = lambda f, *args, **kw: op(encodefilename(f), *args, **kw)
+        self._opener = opener(self.path)
+        self._opener.createmode = self.createmode
+
+    def opener(self, name, *args, **kw):
+       return self._opener(encodefilename(name), *args, **kw)
 
     def datafiles(self):
         for a, b, size in self._walk('data', True):
@@ -284,17 +288,16 @@
         self.pathjoiner = pathjoiner
         self.path = self.pathjoiner(path, 'store')
         self.createmode = _calcmode(self.path)
-        self._op = opener(self.path)
-        self._op.createmode = self.createmode
-        self.fncache = fncache(self._op)
+        self._opener = opener(self.path)
+        self._opener.createmode = self.createmode
+        self.fncache = fncache(self._opener)
 
-        def fncacheopener(path, mode='r', *args, **kw):
-            if (mode not in ('r', 'rb')
-                and path.startswith('data/')
-                and path not in self.fncache):
-                    self.fncache.add(path)
-            return self._op(hybridencode(path), mode, *args, **kw)
-        self.opener = fncacheopener
+    def opener(self, path, mode='r', *args, **kw):
+        if (mode not in ('r', 'rb')
+            and path.startswith('data/')
+            and path not in self.fncache):
+                self.fncache.add(path)
+        return self._opener(hybridencode(path), mode, *args, **kw)
 
     def join(self, f):
         return self.pathjoiner(self.path, hybridencode(f))


More information about the Mercurial-devel mailing list