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

Adrian Buehlmann adrian at cadifra.com
Mon Jul 13 15:06:46 UTC 2009


On 13.07.2009 16:15, Simon Heimberg wrote:
> # 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:

What does this have to do with the change in store.py?

> 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