From 5a34eae5bf00b3289e5ce7c004e772fc51f5376b Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Tue, 9 Oct 2007 03:50:54 +0000 Subject: Optimize away a match_from_list() call inside 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 | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'pym') diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index ee8c4776d..6ef737f8f 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -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 -- cgit v1.2.3-1-g7c22