diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-08-23 08:11:14 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-08-23 08:11:14 +0000 |
commit | 09e6f3ac0f9c47dca05ca4c67bb952f03f038898 (patch) | |
tree | 04619c2ed91a5f050071ae89ac427f0f9e6c514e | |
parent | 6d00f2c1a81c67008d8b1181067f4c5b0627b7dd (diff) | |
download | portage-09e6f3ac0f9c47dca05ca4c67bb952f03f038898.tar.gz portage-09e6f3ac0f9c47dca05ca4c67bb952f03f038898.tar.bz2 portage-09e6f3ac0f9c47dca05ca4c67bb952f03f038898.zip |
Make depgraph.create() avoid metadata lookups for binary packages and ebuilds in cases where an installed package has already been added to the graph. This greatly improves performance when the graph contains a large number of installed packages.
svn path=/main/trunk/; revision=7680
-rw-r--r-- | pym/emerge/__init__.py | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/pym/emerge/__init__.py b/pym/emerge/__init__.py index 6706dc0ce..e055ecee0 100644 --- a/pym/emerge/__init__.py +++ b/pym/emerge/__init__.py @@ -1743,16 +1743,19 @@ class depgraph(object): myeb_matches = portdb.xmatch("match-visible", x) myeb = None ebuild_merge_node = None + installed_node = None if myeb_matches and \ "--usepkgonly" not in self.myopts: myeb = portage.best(myeb_matches) ebuild_merge_node = ("ebuild", myroot, myeb, "merge") + installed_node = ("installed", myroot, myeb, "nomerge") myeb_pkg=None binary_merge_node = None if "--usepkg" in self.myopts and \ not (ebuild_merge_node and \ - self.digraph.contains(ebuild_merge_node)): + (self.digraph.contains(ebuild_merge_node) or \ + self.digraph.contains(installed_node))): # The next line assumes the binarytree has been populated. # XXX: Need to work out how we use the binary tree with roots. myeb_pkg_matches = bindb.match(x) @@ -1802,17 +1805,23 @@ class depgraph(object): if "--usepkgonly" not in self.myopts and myeb_matches: mydb = portdb + mytype = "ebuild" if self.digraph.contains(ebuild_merge_node) and \ ebuild_merge_node not in self._slot_collision_nodes: # reuse cached metadata mydb = self.mydbapi[myroot] + elif self.digraph.contains(installed_node) and \ + installed_node not in self._slot_collision_nodes: + # reuse cached metadata + mydb = self.mydbapi[myroot] + mytype = "installed" metadata = dict(izip(self._mydbapi_keys, mydb.aux_get(myeb, self._mydbapi_keys))) if mydb is portdb: pkgsettings.setcpv(myeb, mydb=portdb) metadata["USE"] = pkgsettings["USE"] matched_packages.append( - (["ebuild", myroot, myeb], metadata)) + ([mytype, myroot, myeb], metadata)) if not matched_packages and \ not (arg and "selective" not in self.myparams): |