diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-10-26 18:06:07 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-10-26 18:06:07 +0000 |
commit | 9915319b594ce940893a7449fec755b24ea73d50 (patch) | |
tree | cc15011bd9d41664b4d081bde60174867352dc3e | |
parent | 33adea25f18c496592b4505a582bbb64af647eac (diff) | |
download | portage-9915319b594ce940893a7449fec755b24ea73d50.tar.gz portage-9915319b594ce940893a7449fec755b24ea73d50.tar.bz2 portage-9915319b594ce940893a7449fec755b24ea73d50.zip |
Optimize repoman to share portdbapi.cp_list() results
between all profiles since those results never change.
The cached results also propagate to the xmatch
match-all when appropriate (old-style virtuals are
excluded since they are profile dependent).
svn path=/main/trunk/; revision=8313
-rwxr-xr-x | bin/repoman | 3 | ||||
-rw-r--r-- | pym/portage/dbapi/porttree.py | 23 |
2 files changed, 19 insertions, 7 deletions
diff --git a/bin/repoman b/bin/repoman index a57c30052..fec17e138 100755 --- a/bin/repoman +++ b/bin/repoman @@ -810,6 +810,8 @@ if isCvs: dofail = 0 arch_caches={} arch_xmatch_caches = {} +shared_xmatch_caches = {"cp-list":{}} + for x in scanlist: #ebuilds and digests added to cvs respectively. logging.info("checking package %s" % x) @@ -1430,6 +1432,7 @@ for x in scanlist: portdb.melt() portdb.freeze() xcache = portdb.xcache + xcache.update(shared_xmatch_caches) arch_xmatch_caches[xmatch_cache_key] = xcache trees["/"]["porttree"].settings = dep_settings diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index f0cc49ac2..4f9b1cbbe 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -494,10 +494,15 @@ class portdbapi(dbapi): def cp_list(self, mycp, use_cache=1, mytree=None): if self.frozen and mytree is None: - mylist = self.xcache["match-all"].get(mycp) - # cp_list() doesn't expand old-style virtuals - if mylist and mylist[0].startswith(mycp): - return mylist[:] + cachelist = self.xcache["cp-list"].get(mycp) + if cachelist is not None: + # Try to propagate this to the match-all cache here for + # repoman since he uses separate match-all caches for each + # 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 + return cachelist[:] mysplit = mycp.split("/") invalid_category = mysplit[0] not in self._categories d={} @@ -535,12 +540,16 @@ class portdbapi(dbapi): cpv = cat + "/" + pn + "-" + ver + "-" + rev mylist[i] = cpv if self.frozen and mytree is None: - if not (not mylist and mycp.startswith("virtual/")): - self.xcache["match-all"][mycp] = mylist[:] + cachelist = mylist[:] + self.xcache["cp-list"][mycp] = cachelist + # 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 return mylist def freeze(self): - for x in "bestmatch-visible", "list-visible", "match-all", \ + for x in "bestmatch-visible", "cp-list", "list-visible", "match-all", \ "match-visible", "minimum-all", "minimum-visible": self.xcache[x]={} self.frozen=1 |