dbapi: account for unevaluated_atom in caches
authorZac Medico <zmedico@gentoo.org>
Sat, 21 Apr 2012 06:38:17 +0000 (23:38 -0700)
committerZac Medico <zmedico@gentoo.org>
Sat, 21 Apr 2012 06:45:31 +0000 (23:45 -0700)
This will fix bug 412391. This is analogous to the bug fixed in
commit 5438bb29c996d777b6343515995176912a7c137f.

pym/_emerge/PackageVirtualDbapi.py
pym/_emerge/depgraph.py
pym/portage/dbapi/porttree.py
pym/portage/dbapi/vartree.py
pym/portage/dbapi/virtual.py

index a692bb60241fe60b4f9fd182398c177cf59d61e7..a34d21c83269d743435193ed4179af3d561c6732 100644 (file)
@@ -1,8 +1,9 @@
-# Copyright 1999-2011 Gentoo Foundation
+# Copyright 1999-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 import sys
 from portage.dbapi import dbapi
+from portage.dbapi.dep_expand import dep_expand
 
 class PackageVirtualDbapi(dbapi):
        """
@@ -76,18 +77,21 @@ class PackageVirtualDbapi(dbapi):
                        self._match_cache = {}
 
        def match(self, origdep, use_cache=1):
-               result = self._match_cache.get(origdep)
+               atom = dep_expand(origdep, mydb=self, settings=self.settings)
+               cache_key = (atom, atom.unevaluated_atom)
+               result = self._match_cache.get(cache_key)
                if result is not None:
                        return result[:]
-               result = dbapi.match(self, origdep, use_cache=use_cache)
-               self._match_cache[origdep] = result
+               result = list(self._iter_match(atom, self.cp_list(atom.cp)))
+               self._match_cache[cache_key] = result
                return result[:]
 
        def cpv_exists(self, cpv, myrepo=None):
                return cpv in self._cpv_map
 
        def cp_list(self, mycp, use_cache=1):
-               cachelist = self._match_cache.get(mycp)
+               cache_key = (mycp, mycp)
+               cachelist = self._match_cache.get(cache_key)
                # cp_list() doesn't expand old-style virtuals
                if cachelist and cachelist[0].startswith(mycp):
                        return cachelist[:]
@@ -98,7 +102,7 @@ class PackageVirtualDbapi(dbapi):
                        cpv_list = [pkg.cpv for pkg in cpv_list]
                self._cpv_sort_ascending(cpv_list)
                if not (not cpv_list and mycp.startswith("virtual/")):
-                       self._match_cache[mycp] = cpv_list
+                       self._match_cache[cache_key] = cpv_list
                return cpv_list[:]
 
        def cp_all(self):
index e77c0e82fd47fa6ae240d31ce0045edced89c81c..e6245598fc904fca301b176e7fcec4c3ac0b60cf 100644 (file)
@@ -6753,7 +6753,8 @@ class _dep_check_composite_db(dbapi):
                return ret
 
        def match(self, atom):
-               ret = self._match_cache.get(atom)
+               cache_key = (atom, atom.unevaluated_atom)
+               ret = self._match_cache.get(cache_key)
                if ret is not None:
                        return ret[:]
 
@@ -6801,7 +6802,7 @@ class _dep_check_composite_db(dbapi):
                        if len(ret) > 1:
                                self._cpv_sort_ascending(ret)
 
-               self._match_cache[atom] = ret
+               self._match_cache[cache_key] = ret
                return ret[:]
 
        def _visible(self, pkg):
index 382bcda4363107716a3e4748720516d22ab136ec..f9d78dcdbc21870844218cab36b869b1f3c0687b 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 1998-2011 Gentoo Foundation
+# Copyright 1998-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 __all__ = [
@@ -731,7 +731,7 @@ class portdbapi(dbapi):
                                # profile (due to old-style virtuals). Do not propagate
                                # old-style virtuals since cp_list() doesn't expand them.
                                if not (not cachelist and mycp.startswith("virtual/")):
-                                       self.xcache["match-all"][mycp] = cachelist
+                                       self.xcache["match-all"][(mycp, mycp)] = cachelist
                                return cachelist[:]
                mysplit = mycp.split("/")
                invalid_category = mysplit[0] not in self._categories
@@ -786,7 +786,7 @@ class portdbapi(dbapi):
                        # Do not propagate old-style virtuals since
                        # cp_list() doesn't expand them.
                        if not (not cachelist and mycp.startswith("virtual/")):
-                               self.xcache["match-all"][mycp] = cachelist
+                               self.xcache["match-all"][(mycp, mycp)] = cachelist
                return mylist
 
        def freeze(self):
@@ -809,19 +809,21 @@ class portdbapi(dbapi):
                                "has been renamed to match-visible",
                                DeprecationWarning, stacklevel=2)
 
-               #if no updates are being made to the tree, we can consult our xcache...
-               if self.frozen:
-                       try:
-                               return self.xcache[level][origdep][:]
-                       except KeyError:
-                               pass
-
                if mydep is None:
                        #this stuff only runs on first call of xmatch()
                        #create mydep, mykey from origdep
                        mydep = dep_expand(origdep, mydb=self, settings=self.settings)
                        mykey = mydep.cp
 
+               #if no updates are being made to the tree, we can consult our xcache...
+               cache_key = None
+               if self.frozen:
+                       cache_key = (mydep, mydep.unevaluated_atom)
+                       try:
+                               return self.xcache[level][cache_key][:]
+                       except KeyError:
+                               pass
+
                myval = None
                mytree = None
                if mydep.repo is not None:
@@ -930,9 +932,7 @@ class portdbapi(dbapi):
                if self.frozen:
                        xcache_this_level = self.xcache.get(level)
                        if xcache_this_level is not None:
-                               xcache_this_level[mydep] = myval
-                               if origdep and origdep != mydep:
-                                       xcache_this_level[origdep] = myval
+                               xcache_this_level[cache_key] = myval
                                myval = myval[:]
 
                return myval
index a3a6c76add5432dbcd25c30a664fb616461cae10..ec9f87c3570fc65ffbde257bb6be79860a9135c7 100644 (file)
@@ -484,6 +484,7 @@ class vardbapi(dbapi):
                "caching match function"
                mydep = dep_expand(
                        origdep, mydb=self, use_cache=use_cache, settings=self.settings)
+               cache_key = (mydep, mydep.unevaluated_atom)
                mykey = dep_getkey(mydep)
                mycat = catsplit(mykey)[0]
                if not use_cache:
@@ -505,8 +506,8 @@ class vardbapi(dbapi):
                if mydep not in self.matchcache[mycat]:
                        mymatch = list(self._iter_match(mydep,
                                self.cp_list(mydep.cp, use_cache=use_cache)))
-                       self.matchcache[mycat][mydep] = mymatch
-               return self.matchcache[mycat][mydep][:]
+                       self.matchcache[mycat][cache_key] = mymatch
+               return self.matchcache[mycat][cache_key][:]
 
        def findname(self, mycpv, myrepo=None):
                return self.getpath(str(mycpv), filename=catsplit(mycpv)[1]+".ebuild")
index ec97ffed609a88f3a16d942a50711536b44f0058..eed1407fc0ee60c7dd87ad1c2e19c97930ab9778 100644 (file)
@@ -1,8 +1,9 @@
-# Copyright 1998-2007 Gentoo Foundation
+# Copyright 1998-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 
 from portage.dbapi import dbapi
+from portage.dbapi.dep_expand import dep_expand
 from portage import cpv_getkey
 
 class fakedbapi(dbapi):
@@ -31,18 +32,21 @@ class fakedbapi(dbapi):
                        self._match_cache = {}
 
        def match(self, origdep, use_cache=1):
-               result = self._match_cache.get(origdep, None)
+               atom = dep_expand(origdep, mydb=self, settings=self.settings)
+               cache_key = (atom, atom.unevaluated_atom)
+               result = self._match_cache.get(cache_key)
                if result is not None:
                        return result[:]
-               result = dbapi.match(self, origdep, use_cache=use_cache)
-               self._match_cache[origdep] = result
+               result = list(self._iter_match(atom, self.cp_list(atom.cp)))
+               self._match_cache[cache_key] = result
                return result[:]
 
        def cpv_exists(self, mycpv, myrepo=None):
                return mycpv in self.cpvdict
 
        def cp_list(self, mycp, use_cache=1, myrepo=None):
-               cachelist = self._match_cache.get(mycp)
+               cache_key = (mycp, mycp)
+               cachelist = self._match_cache.get(cache_key)
                # cp_list() doesn't expand old-style virtuals
                if cachelist and cachelist[0].startswith(mycp):
                        return cachelist[:]
@@ -51,7 +55,7 @@ class fakedbapi(dbapi):
                        cpv_list = []
                self._cpv_sort_ascending(cpv_list)
                if not (not cpv_list and mycp.startswith("virtual/")):
-                       self._match_cache[mycp] = cpv_list
+                       self._match_cache[cache_key] = cpv_list
                return cpv_list[:]
 
        def cp_all(self):