Optimize away a match_from_list() call inside
authorZac Medico <zmedico@gentoo.org>
Tue, 9 Oct 2007 03:50:54 +0000 (03:50 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 9 Oct 2007 03:50:54 +0000 (03:50 -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.

svn path=/main/trunk/; revision=8008

pym/portage/dbapi/porttree.py

index ee8c4776d622bbe6a9059dde2e16731d5e80b37d..6ef737f8f05ceba0ab19dcbb3018a9346c9a0d84 100644 (file)
@@ -499,6 +499,10 @@ class portdbapi(dbapi):
                return d.keys()
 
        def cp_list(self, mycp, use_cache=1, mytree=None):
+               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={}
@@ -519,8 +523,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"]:
@@ -573,8 +581,10 @@ class portdbapi(dbapi):
                                self.xmatch("list-visible", mykey, mydep=mykey, mykey=mykey))
                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