Gentoo Archives: gentoo-portage-dev

From: Sebastian Luther <SebastianLuther@×××.de>
To: gentoo-portage-dev@l.g.o
Subject: [gentoo-portage-dev] [PATCH 02/10] Replace _slot_pkg_map and some tree dbapiS with _package_tracker
Date: Wed, 29 Jan 2014 15:33:50
Message-Id: 1391009594-22750-3-git-send-email-SebastianLuther@gmx.de
In Reply to: [gentoo-portage-dev] [PATCH 00/10] First steps to get rid of backtracking by Sebastian Luther
1 ---
2 pym/_emerge/depgraph.py | 48 ++++++++++++++++++++--------------
3 pym/_emerge/resolver/output_helpers.py | 7 ++---
4 2 files changed, 32 insertions(+), 23 deletions(-)
5
6 diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
7 index 83035c2..fd59dda 100644
8 --- a/pym/_emerge/depgraph.py
9 +++ b/pym/_emerge/depgraph.py
10 @@ -75,6 +75,7 @@ from _emerge.UseFlagDisplay import pkg_use_display
11 from _emerge.userquery import userquery
12
13 from _emerge.resolver.backtracking import Backtracker, BacktrackParameter
14 +from _emerge.resolver.package_tracker import PackageTracker, PackageTrackerDbapiWrapper
15 from _emerge.resolver.slot_collision import slot_conflict_handler
16 from _emerge.resolver.circular_dependency import circular_dependency_handler
17 from _emerge.resolver.output import Display
18 @@ -341,8 +342,6 @@ class _dynamic_depgraph_config(object):
19 self.myparams = myparams.copy()
20 self._vdb_loaded = False
21 self._allow_backtracking = allow_backtracking
22 - # Maps slot atom to package for each Package added to the graph.
23 - self._slot_pkg_map = {}
24 # Maps nodes to the reasons they were selected for reinstallation.
25 self._reinstall_nodes = {}
26 self.mydbapi = {}
27 @@ -432,14 +431,14 @@ class _dynamic_depgraph_config(object):
28 self._traverse_ignored_deps = False
29 self._complete_mode = False
30 self._slot_operator_deps = {}
31 + self._package_tracker = PackageTracker()
32
33 for myroot in depgraph._frozen_config.trees:
34 self.sets[myroot] = _depgraph_sets()
35 - self._slot_pkg_map[myroot] = {}
36 vardb = depgraph._frozen_config.trees[myroot]["vartree"].dbapi
37 # This dbapi instance will model the state that the vdb will
38 # have after new packages have been installed.
39 - fakedb = PackageVirtualDbapi(vardb.settings)
40 + fakedb = PackageTrackerDbapiWrapper(myroot, self._package_tracker)
41
42 self.mydbapi[myroot] = fakedb
43 def graph_tree():
44 @@ -564,12 +563,12 @@ class depgraph(object):
45
46 if not dynamic_deps:
47 for pkg in vardb:
48 - fakedb.cpv_inject(pkg)
49 + self._dynamic_config._package_tracker.add_installed_pkg(pkg)
50 else:
51 max_jobs = self._frozen_config.myopts.get("--jobs")
52 max_load = self._frozen_config.myopts.get("--load-average")
53 scheduler = TaskScheduler(
54 - self._dynamic_deps_preload(fake_vartree, fakedb),
55 + self._dynamic_deps_preload(fake_vartree),
56 max_jobs=max_jobs,
57 max_load=max_load,
58 event_loop=fake_vartree._portdb._event_loop)
59 @@ -578,11 +577,11 @@ class depgraph(object):
60
61 self._dynamic_config._vdb_loaded = True
62
63 - def _dynamic_deps_preload(self, fake_vartree, fakedb):
64 + def _dynamic_deps_preload(self, fake_vartree):
65 portdb = fake_vartree._portdb
66 for pkg in fake_vartree.dbapi:
67 self._spinner_update()
68 - fakedb.cpv_inject(pkg)
69 + self._dynamic_config._package_tracker.add_installed_pkg(pkg)
70 ebuild_path, repo_path = \
71 portdb.findname2(pkg.cpv, myrepo=pkg.repo)
72 if ebuild_path is None:
73 @@ -1050,7 +1049,8 @@ class depgraph(object):
74 all_parents, conflict_pkgs):
75
76 debug = "--debug" in self._frozen_config.myopts
77 - existing_node = self._dynamic_config._slot_pkg_map[root][slot_atom]
78 + existing_node = next(self._dynamic_config._package_tracker.match(
79 + root, slot_atom, installed=False))
80 # In order to avoid a missed update, first mask lower versions
81 # that conflict with higher versions (the backtracker visits
82 # these in reverse order).
83 @@ -1827,8 +1827,8 @@ class depgraph(object):
84 # The caller has selected a specific package
85 # via self._minimize_packages().
86 dep_pkg = dep.child
87 - existing_node = self._dynamic_config._slot_pkg_map[
88 - dep.root].get(dep_pkg.slot_atom)
89 + existing_node = next(self._dynamic_config._package_tracker.match(
90 + dep.root, dep_pkg.slot_atom, installed=False), None)
91
92 if not dep_pkg:
93 if (dep.collapsed_priority.optional or
94 @@ -1893,7 +1893,9 @@ class depgraph(object):
95 return 1
96
97 def _check_slot_conflict(self, pkg, atom):
98 - existing_node = self._dynamic_config._slot_pkg_map[pkg.root].get(pkg.slot_atom)
99 + existing_node = next(self._dynamic_config._package_tracker.match(
100 + pkg.root, pkg.slot_atom, installed=False), None)
101 +
102 matches = None
103 if existing_node:
104 matches = pkg.cpv == existing_node.cpv
105 @@ -2046,7 +2048,7 @@ class depgraph(object):
106 # function despite collisions.
107 pass
108 elif not previously_added:
109 - self._dynamic_config._slot_pkg_map[pkg.root][pkg.slot_atom] = pkg
110 + self._dynamic_config._package_tracker.add_pkg(pkg)
111 self._dynamic_config.mydbapi[pkg.root].cpv_inject(pkg)
112 self._dynamic_config._filtered_trees[pkg.root]["porttree"].dbapi._clear_cache()
113 self._dynamic_config._highest_pkg_cache.clear()
114 @@ -2162,7 +2164,8 @@ class depgraph(object):
115 slot_nodes = self._dynamic_config._slot_collision_info.get(slot_key)
116 if slot_nodes is None:
117 slot_nodes = set()
118 - slot_nodes.add(self._dynamic_config._slot_pkg_map[pkg.root][pkg.slot_atom])
119 + slot_nodes.update(self._dynamic_config._package_tracker.match(
120 + pkg.root, pkg.slot_atom, installed=False))
121 self._dynamic_config._slot_collision_info[slot_key] = slot_nodes
122 slot_nodes.add(pkg)
123
124 @@ -2347,8 +2350,8 @@ class depgraph(object):
125 mypriority.satisfied.visible and \
126 dep.child is not None and \
127 not dep.child.installed and \
128 - self._dynamic_config._slot_pkg_map[dep.child.root].get(
129 - dep.child.slot_atom) is None and \
130 + not any(self._dynamic_config._package_tracker.match(
131 + dep.child.root, dep.child.slot_atom, installed=False)) and \
132 not slot_operator_rebuild
133
134 def _wrapped_add_pkg_dep_string(self, pkg, dep_root, dep_priority,
135 @@ -5071,7 +5074,9 @@ class depgraph(object):
136 # will always end with a break statement below
137 # this point.
138 if find_existing_node:
139 - e_pkg = self._dynamic_config._slot_pkg_map[root].get(pkg.slot_atom)
140 + e_pkg = next(self._dynamic_config._package_tracker.match(
141 + root, pkg.slot_atom, installed=False), None)
142 +
143 if not e_pkg:
144 break
145
146 @@ -5319,7 +5324,9 @@ class depgraph(object):
147 matches = unmasked
148
149 pkg = matches[-1] # highest match
150 - in_graph = self._dynamic_config._slot_pkg_map[root].get(pkg.slot_atom)
151 + in_graph = next(self._dynamic_config._package_tracker.match(
152 + root, pkg.slot_atom, installed=False), None)
153 +
154 return pkg, in_graph
155
156 def _complete_graph(self, required_sets=None):
157 @@ -7988,8 +7995,9 @@ class _dep_check_composite_db(dbapi):
158 elif not self._depgraph._equiv_ebuild_visible(pkg):
159 return False
160
161 - in_graph = self._depgraph._dynamic_config._slot_pkg_map[
162 - self._root].get(pkg.slot_atom)
163 + in_graph = next(self._depgraph._dynamic_config._package_tracker.match(
164 + self._root, pkg.slot_atom, installed=False), None)
165 +
166 if in_graph is None:
167 # Mask choices for packages which are not the highest visible
168 # version within their slot (since they usually trigger slot
169 diff --git a/pym/_emerge/resolver/output_helpers.py b/pym/_emerge/resolver/output_helpers.py
170 index cfa6910..58b2694 100644
171 --- a/pym/_emerge/resolver/output_helpers.py
172 +++ b/pym/_emerge/resolver/output_helpers.py
173 @@ -227,7 +227,7 @@ class _DisplayConfig(object):
174 self.reinstall_nodes = dynamic_config._reinstall_nodes
175 self.digraph = dynamic_config.digraph
176 self.blocker_uninstalls = dynamic_config._blocker_uninstalls
177 - self.slot_pkg_map = dynamic_config._slot_pkg_map
178 + self.package_tracker = dynamic_config._package_tracker
179 self.set_nodes = dynamic_config._set_nodes
180
181 self.pkg_use_enabled = depgraph._pkg_use_enabled
182 @@ -370,8 +370,9 @@ def _tree_display(conf, mylist):
183 # If the uninstall task did not need to be executed because
184 # of an upgrade, display Blocker -> Upgrade edges since the
185 # corresponding Blocker -> Uninstall edges will not be shown.
186 - upgrade_node = \
187 - conf.slot_pkg_map[uninstall.root].get(uninstall.slot_atom)
188 + upgrade_node = next(conf.package_tracker.match(
189 + uninstall.root, uninstall.slot_atom), None)
190 +
191 if upgrade_node is not None and \
192 uninstall not in executed_uninstalls:
193 for blocker in uninstall_parents:
194 --
195 1.8.3.2