[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