summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-04-05 19:00:38 +0000
committerZac Medico <zmedico@gentoo.org>2008-04-05 19:00:38 +0000
commit055a588d2b4ae8135ab5bef77949b3b8c99d2019 (patch)
tree9177c4c93c9a4ed66e99fb32fe3a3ac9464d015f /bin
parentf13390d3a1d649a95d26dbf63b3be8d4d3f1c47e (diff)
downloadportage-055a588d2b4ae8135ab5bef77949b3b8c99d2019.tar.gz
portage-055a588d2b4ae8135ab5bef77949b3b8c99d2019.tar.bz2
portage-055a588d2b4ae8135ab5bef77949b3b8c99d2019.zip
For better performace and consistency in package selection, merge the
CompositeDbapi code from trunk. svn path=/main/branches/2.1.2/; revision=9721
Diffstat (limited to 'bin')
-rwxr-xr-xbin/emerge63
1 files changed, 58 insertions, 5 deletions
diff --git a/bin/emerge b/bin/emerge
index 1bfe6ec88..01cbf8dbc 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -1463,6 +1463,39 @@ def show_invalid_depstring_notice(parent_node, depstring, error_msg):
f.add_flowing_data(x)
f.end_paragraph(1)
+class CompositeDbapi(object):
+ def __init__(self, depgraph, root):
+ self._depgraph = depgraph
+ self._root = root
+ self._match_cache = {}
+ self._cpv_tree_map = {}
+
+ def match(self, atom):
+ ret = self._match_cache.get(atom)
+ if ret is not None:
+ return ret[:]
+ pkg, existing = self._depgraph._select_package(self._root, atom)
+ if not pkg:
+ ret = []
+ else:
+ if pkg.installed and "selective" not in self._depgraph.myparams:
+ try:
+ if self._depgraph._set_atoms.findAtomForPackage(
+ pkg.cpv, pkg.metadata):
+ ret = []
+ except portage_exception.InvalidDependString:
+ pass
+ if ret is None:
+ self._cpv_tree_map[pkg.cpv] = \
+ self._depgraph.pkg_tree_map[pkg.type_name]
+ ret = [pkg.cpv]
+ self._match_cache[atom] = ret
+ return ret[:]
+
+ def aux_get(self, cpv, wants):
+ return self._depgraph.trees[self._root][
+ self._cpv_tree_map[cpv]].dbapi.aux_get(cpv, wants)
+
class depgraph:
pkg_tree_map = {
@@ -1524,6 +1557,11 @@ class depgraph:
vardb.aux_get(pkg, self._mydbapi_keys))))
del vardb, fakedb
self._filtered_trees[myroot] = {}
+ self._filtered_trees[myroot]["vartree"] = self.trees[myroot]["vartree"]
+ def filtered_tree():
+ pass
+ filtered_tree.dbapi = CompositeDbapi(self, myroot)
+ self._filtered_trees[myroot]["porttree"] = filtered_tree
dbs = []
portdb = self.trees[myroot]["porttree"].dbapi
bindb = self.trees[myroot]["bintree"].dbapi
@@ -1568,6 +1606,7 @@ class depgraph:
self._unsatisfied_deps_for_display = []
self._world_problems = False
self._select_package = self._select_pkg_highest_available
+ self._highest_pkg_cache = {}
def _show_slot_collision_notice(self):
"""Show an informational message advising the user to mask one of the
@@ -2206,6 +2245,23 @@ class depgraph:
print
def _select_pkg_highest_available(self, root, atom, onlydeps=False):
+ cache_key = (root, atom, onlydeps)
+ ret = self._highest_pkg_cache.get(cache_key)
+ if ret is not None:
+ pkg, existing = ret
+ if pkg and not existing:
+ existing = self._slot_pkg_map[root].get(pkg.slot_atom)
+ if existing and existing == pkg:
+ # Update the cache to reflect that the
+ # package has been added to the graph.
+ ret = pkg, pkg
+ self._highest_pkg_cache[cache_key] = ret
+ return ret
+ ret = self._select_pkg_highest_available_imp(root, atom, onlydeps=onlydeps)
+ self._highest_pkg_cache[cache_key] = ret
+ return ret
+
+ def _select_pkg_highest_available_imp(self, root, atom, onlydeps=False):
pkgsettings = self.pkgsettings[root]
dbs = self._filtered_trees[root]["dbs"]
vardb = self.roots[root].trees["vartree"].dbapi
@@ -2462,15 +2518,12 @@ class depgraph:
mymerge = []
else:
try:
- self.trees[myroot]["selective"] = "selective" in self.myparams
if myparent and p_status == "nomerge":
portage_dep._dep_check_strict = False
mycheck = portage.dep_check(depstring, None,
- pkgsettings, myuse=myuse,
- use_binaries=("--usepkgonly" in self.myopts),
- myroot=myroot, trees=self.trees)
+ pkgsettings, myuse=myuse, myroot=myroot,
+ trees=self._filtered_trees)
finally:
- self.trees[myroot]["selective"] = False
portage_dep._dep_check_strict = True
if not mycheck[0]: