Optimize away a match_from_list() call inside
authorZac Medico <zmedico@gentoo.org>
Fri, 12 Oct 2007 06:19:17 +0000 (06:19 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 12 Oct 2007 06:19:17 +0000 (06:19 -0000)
portdbapi.xmatch("match-all") when given atom has no
operator or version. Also, make cp_list() use the
xmatch("match-all") cache when possible. (trunk r8008)

svn path=/main/branches/2.1.2/; revision=8066

pym/portage.py

index 447759c2b2a76f16a060fc11e014eb9257719b17..8afd051ca62609ec21111249d93eddb08460553b 100644 (file)
@@ -6477,7 +6477,11 @@ class portdbapi(dbapi):
                return d.keys()
 
        def cp_list(self, mycp, use_cache=1, mytree=None):
-               mysplit=mycp.split("/")
+               if self.frozen and mytree is None:
+                       mylist = self.xcache["match-all"].get(mycp)
+                       if mylist is not None:
+                               return mylist[:]
+               mysplit = mycp.split("/")
                invalid_category = mysplit[0] not in self._categories
                d={}
                if mytree:
@@ -6497,8 +6501,12 @@ class portdbapi(dbapi):
                if invalid_category and d:
                        writemsg(("\n!!! '%s' has a category that is not listed in " + \
                                "/etc/portage/categories\n") % mycp, noiselevel=-1)
-                       return []
-               return d.keys()
+                       mylist = []
+               else:
+                       mylist = d.keys()
+               if self.frozen and mytree is None:
+                       self.xcache["match-all"][mycp] = mylist[:]
+               return mylist
 
        def freeze(self):
                for x in ["list-visible","bestmatch-visible","match-visible","match-all"]:
@@ -6546,7 +6554,10 @@ class portdbapi(dbapi):
                        #get all visible packages, then get the matching ones
                elif level=="match-all":
                        #match *all* visible *and* masked packages
-                       myval=match_from_list(mydep,self.cp_list(mykey))
+                       if mydep == mykey:
+                               myval = self.cp_list(mykey)
+                       else:
+                               myval = match_from_list(mydep, self.cp_list(mykey))
                else:
                        print "ERROR: xmatch doesn't handle",level,"query!"
                        raise KeyError