1 |
Author: zmedico |
2 |
Date: 2008-05-27 04:32:58 +0000 (Tue, 27 May 2008) |
3 |
New Revision: 10442 |
4 |
|
5 |
Modified: |
6 |
main/branches/2.1.2/bin/emerge |
7 |
Log: |
8 |
Merge code for the Package.root_config attribute from trunk r10440, |
9 |
excluding USE deps code. |
10 |
|
11 |
|
12 |
Modified: main/branches/2.1.2/bin/emerge |
13 |
=================================================================== |
14 |
--- main/branches/2.1.2/bin/emerge 2008-05-27 04:10:11 UTC (rev 10441) |
15 |
+++ main/branches/2.1.2/bin/emerge 2008-05-27 04:32:58 UTC (rev 10442) |
16 |
@@ -390,16 +390,18 @@ |
17 |
# |
18 |
# public interface |
19 |
# |
20 |
- def __init__(self, settings, trees, spinner, searchdesc, |
21 |
+ def __init__(self, root_config, spinner, searchdesc, |
22 |
verbose, usepkg, usepkgonly): |
23 |
"""Searches the available and installed packages for the supplied search key. |
24 |
The list of available and installed packages is created at object instantiation. |
25 |
This makes successive searches faster.""" |
26 |
- self.settings = settings |
27 |
- self.vartree = trees["vartree"] |
28 |
+ self.settings = root_config.settings |
29 |
+ self.vartree = root_config.trees["vartree"] |
30 |
self.spinner = spinner |
31 |
self.verbose = verbose |
32 |
self.searchdesc = searchdesc |
33 |
+ self.root_config = root_config |
34 |
+ self.setconfig = root_config.setconfig |
35 |
|
36 |
def fake_portdb(): |
37 |
pass |
38 |
@@ -410,9 +412,9 @@ |
39 |
|
40 |
self._dbs = [] |
41 |
|
42 |
- portdb = trees["porttree"].dbapi |
43 |
- bindb = trees["bintree"].dbapi |
44 |
- vardb = trees["vartree"].dbapi |
45 |
+ portdb = root_config.trees["porttree"].dbapi |
46 |
+ bindb = root_config.trees["bintree"].dbapi |
47 |
+ vardb = root_config.trees["vartree"].dbapi |
48 |
|
49 |
if not usepkgonly and portdb._have_root_eclass_dir: |
50 |
self._dbs.append(portdb) |
51 |
@@ -470,7 +472,7 @@ |
52 |
elif built: |
53 |
pkg_type = "binary" |
54 |
return visible(self.settings, |
55 |
- Package(type_name=pkg_type, root=self.settings["ROOT"], |
56 |
+ Package(type_name=pkg_type, root_config=self.root_config, |
57 |
cpv=cpv, built=built, installed=installed, metadata=metadata)) |
58 |
|
59 |
def _xmatch(self, level, atom): |
60 |
@@ -898,7 +900,7 @@ |
61 |
in world since system atoms can only match one slot while world atoms can |
62 |
be greedy with respect to slots. Unslotted system packages will not be |
63 |
stored in world.""" |
64 |
- pkg = Package(cpv=pkg_key, metadata=metadata) |
65 |
+ pkg = Package(cpv=pkg_key, root_config=root_config, metadata=metadata) |
66 |
arg_atom = args_set.findAtomForPackage(pkg) |
67 |
if not arg_atom: |
68 |
return None |
69 |
@@ -1134,11 +1136,14 @@ |
70 |
user doesn't necessarily need write access to the vardb in cases where |
71 |
global updates are necessary (updates are performed when necessary if there |
72 |
is not a matching ebuild in the tree).""" |
73 |
- def __init__(self, real_vartree, portdb, |
74 |
- db_keys, pkg_cache, acquire_lock=1): |
75 |
+ def __init__(self, root_config, pkg_cache=None, acquire_lock=1): |
76 |
+ if pkg_cache is None: |
77 |
+ pkg_cache = {} |
78 |
+ real_vartree = root_config.trees["vartree"] |
79 |
+ portdb = root_config.trees["porttree"].dbapi |
80 |
self.root = real_vartree.root |
81 |
self.settings = real_vartree.settings |
82 |
- mykeys = db_keys[:] |
83 |
+ mykeys = list(Package.metadata_keys) |
84 |
for required_key in ("COUNTER", "SLOT"): |
85 |
if required_key not in mykeys: |
86 |
mykeys.append(required_key) |
87 |
@@ -1179,7 +1184,7 @@ |
88 |
if pkg is None: |
89 |
pkg = Package(built=True, cpv=cpv, |
90 |
installed=True, metadata=metadata, |
91 |
- root=self.root, type_name="installed") |
92 |
+ root_config=root_config, type_name="installed") |
93 |
self._pkg_cache[pkg] = pkg |
94 |
self.dbapi.cpv_inject(pkg) |
95 |
real_dbapi.flush_cache() |
96 |
@@ -1311,7 +1316,7 @@ |
97 |
if metadata is None: |
98 |
mreasons = ["corruption"] |
99 |
else: |
100 |
- pkg = Package(type_name=pkg_type, root=root_config.root, |
101 |
+ pkg = Package(type_name=pkg_type, root_config=root_config, |
102 |
cpv=cpv, built=built, installed=installed, metadata=metadata) |
103 |
mreasons = get_masking_status(pkg, pkgsettings, root_config) |
104 |
return metadata, mreasons |
105 |
@@ -1401,9 +1406,9 @@ |
106 |
class Package(Task): |
107 |
__slots__ = ("built", "cpv", "depth", |
108 |
"installed", "metadata", "onlydeps", "operation", |
109 |
- "root", "type_name", |
110 |
- "category", "cp", "cpv_split", |
111 |
- "pf", "pv_split", "slot", "slot_atom", "use") |
112 |
+ "root_config", "type_name", |
113 |
+ "category", "cp", "cpv_split", "iuse", |
114 |
+ "pf", "pv_split", "root", "slot", "slot_atom", "use") |
115 |
|
116 |
metadata_keys = [ |
117 |
"CHOST", "COUNTER", "DEPEND", "EAPI", "IUSE", "KEYWORDS", |
118 |
@@ -1412,6 +1417,7 @@ |
119 |
|
120 |
def __init__(self, **kwargs): |
121 |
Task.__init__(self, **kwargs) |
122 |
+ self.root = self.root_config.root |
123 |
self.metadata = self._metadata_wrapper(self, self.metadata) |
124 |
self.cp = portage.cpv_getkey(self.cpv) |
125 |
self.slot_atom = portage_dep.Atom("%s:%s" % (self.cp, self.slot)) |
126 |
@@ -1420,13 +1426,39 @@ |
127 |
self.pv_split = self.cpv_split[1:] |
128 |
|
129 |
class _use(object): |
130 |
+ |
131 |
+ __slots__ = ("__weakref__", "enabled") |
132 |
+ |
133 |
def __init__(self, use): |
134 |
self.enabled = frozenset(use) |
135 |
|
136 |
+ class _iuse(object): |
137 |
+ |
138 |
+ __slots__ = ("__weakref__", "all", "enabled", "disabled", "iuse_implicit", "tokens") |
139 |
+ |
140 |
+ def __init__(self, tokens): |
141 |
+ self.tokens = tuple(tokens) |
142 |
+ enabled = [] |
143 |
+ disabled = [] |
144 |
+ other = [] |
145 |
+ for x in tokens: |
146 |
+ prefix = x[:1] |
147 |
+ if prefix == "+": |
148 |
+ enabled.append(x[1:]) |
149 |
+ elif prefix == "-": |
150 |
+ disabled.append(x[1:]) |
151 |
+ else: |
152 |
+ other.append(x) |
153 |
+ self.enabled = frozenset(enabled) |
154 |
+ self.disabled = frozenset(disabled) |
155 |
+ self.all = frozenset(chain(enabled, disabled, other)) |
156 |
+ |
157 |
class _metadata_wrapper(dict): |
158 |
""" |
159 |
Detect metadata updates and synchronize Package attributes. |
160 |
""" |
161 |
+ _wrapped_keys = frozenset(["IUSE", "SLOT", "USE"]) |
162 |
+ |
163 |
def __init__(self, pkg, metadata): |
164 |
dict.__init__(self) |
165 |
self._pkg = pkg |
166 |
@@ -1440,11 +1472,18 @@ |
167 |
|
168 |
def __setitem__(self, k, v): |
169 |
dict.__setitem__(self, k, v) |
170 |
- if k == "USE": |
171 |
- self._pkg.use = self._pkg._use(v.split()) |
172 |
- elif k == "SLOT": |
173 |
- self._pkg.slot = v |
174 |
+ if k in self._wrapped_keys: |
175 |
+ getattr(self, "_set_" + k.lower())(k, v) |
176 |
|
177 |
+ def _set_iuse(self, k, v): |
178 |
+ self._pkg.iuse = self._pkg._iuse(v.split()) |
179 |
+ |
180 |
+ def _set_slot(self, k, v): |
181 |
+ self._pkg.slot = v |
182 |
+ |
183 |
+ def _set_use(self, k, v): |
184 |
+ self._pkg.use = self._pkg._use(v.split()) |
185 |
+ |
186 |
def _get_hash_key(self): |
187 |
hash_key = getattr(self, "_hash_key", None) |
188 |
if hash_key is None: |
189 |
@@ -1680,9 +1719,10 @@ |
190 |
|
191 |
class BlockerDB(object): |
192 |
|
193 |
- def __init__(self, vartree, portdb): |
194 |
- self._vartree = vartree |
195 |
- self._portdb = portdb |
196 |
+ def __init__(self, root_config): |
197 |
+ self._root_config = root_config |
198 |
+ self._vartree = root_config.trees["vartree"] |
199 |
+ self._portdb = root_config.trees["porttree"].dbapi |
200 |
self._blocker_cache = \ |
201 |
BlockerCache(self._vartree.root, vartree.dbapi) |
202 |
self._dep_check_trees = { self._vartree.root : { |
203 |
@@ -1697,9 +1737,7 @@ |
204 |
settings = self._vartree.settings |
205 |
stale_cache = set(blocker_cache) |
206 |
fake_vartree = \ |
207 |
- FakeVartree(self._vartree, |
208 |
- self._portdb, Package.metadata_keys, {}, |
209 |
- acquire_lock=acquire_lock) |
210 |
+ FakeVartree(self._root_config, acquire_lock=acquire_lock) |
211 |
vardb = fake_vartree.dbapi |
212 |
installed_pkgs = list(vardb) |
213 |
|
214 |
@@ -1975,9 +2013,8 @@ |
215 |
for tree in ("porttree", "bintree"): |
216 |
self.trees[myroot][tree] = trees[myroot][tree] |
217 |
self.trees[myroot]["vartree"] = \ |
218 |
- FakeVartree(trees[myroot]["vartree"], |
219 |
- trees[myroot]["porttree"].dbapi, |
220 |
- self._mydbapi_keys, self._pkg_cache) |
221 |
+ FakeVartree(trees[myroot]["root_config"], |
222 |
+ pkg_cache=self._pkg_cache) |
223 |
self.pkgsettings[myroot] = portage.config( |
224 |
clone=self.trees[myroot]["vartree"].settings) |
225 |
self._slot_pkg_map[myroot] = {} |
226 |
@@ -1988,14 +2025,10 @@ |
227 |
# have after new packages have been installed. |
228 |
fakedb = PackageVirtualDbapi(vardb.settings) |
229 |
if preload_installed_pkgs: |
230 |
- for cpv in vardb.cpv_all(): |
231 |
+ for pkg in vardb: |
232 |
self.spinner.update() |
233 |
- metadata = dict(izip(self._mydbapi_keys, |
234 |
- vardb.aux_get(cpv, self._mydbapi_keys))) |
235 |
- pkg = Package(built=True, cpv=cpv, |
236 |
- installed=True, metadata=metadata, |
237 |
- root=myroot, type_name="installed") |
238 |
- self._pkg_cache[pkg] = pkg |
239 |
+ # This triggers metadata updates via FakeVartree. |
240 |
+ vardb.aux_get(pkg.cpv, []) |
241 |
fakedb.cpv_inject(pkg) |
242 |
self.mydbapi[myroot] = fakedb |
243 |
def graph_tree(): |
244 |
@@ -2639,7 +2672,7 @@ |
245 |
return 0, myfavorites |
246 |
metadata = dict(izip(self._mydbapi_keys, |
247 |
bindb.aux_get(mykey, self._mydbapi_keys))) |
248 |
- pkg = Package(type_name="binary", root=myroot, |
249 |
+ pkg = Package(type_name="binary", root_config=root_config, |
250 |
cpv=mykey, built=True, metadata=metadata, |
251 |
onlydeps=onlydeps) |
252 |
self._pkg_cache[pkg] = pkg |
253 |
@@ -2679,7 +2712,7 @@ |
254 |
portdb.aux_get(mykey, self._mydbapi_keys))) |
255 |
pkgsettings.setcpv(mykey, mydb=metadata) |
256 |
metadata["USE"] = pkgsettings["PORTAGE_USE"] |
257 |
- pkg = Package(type_name="ebuild", root=myroot, |
258 |
+ pkg = Package(type_name="ebuild", root_config=root_config, |
259 |
cpv=mykey, metadata=metadata, onlydeps=onlydeps) |
260 |
self._pkg_cache[pkg] = pkg |
261 |
args.append(PackageArg(arg=x, package=pkg, |
262 |
@@ -3069,6 +3102,7 @@ |
263 |
return ret |
264 |
|
265 |
def _select_pkg_highest_available_imp(self, root, atom, onlydeps=False): |
266 |
+ root_config = self.roots[root] |
267 |
pkgsettings = self.pkgsettings[root] |
268 |
dbs = self._filtered_trees[root]["dbs"] |
269 |
vardb = self.roots[root].trees["vartree"].dbapi |
270 |
@@ -3154,7 +3188,8 @@ |
271 |
continue |
272 |
pkg = Package(built=built, cpv=cpv, |
273 |
installed=installed, metadata=metadata, |
274 |
- onlydeps=onlydeps, root=root, type_name=pkg_type) |
275 |
+ onlydeps=onlydeps, root_config=root_config, |
276 |
+ type_name=pkg_type) |
277 |
metadata = pkg.metadata |
278 |
if not built and ("?" in metadata["LICENSE"] or \ |
279 |
"?" in metadata["PROVIDE"]): |
280 |
@@ -3680,7 +3715,8 @@ |
281 |
uninst_task = Package(built=inst_pkg.built, |
282 |
cpv=inst_pkg.cpv, installed=inst_pkg.installed, |
283 |
metadata=inst_pkg.metadata, |
284 |
- operation="uninstall", root=inst_pkg.root, |
285 |
+ operation="uninstall", |
286 |
+ root_config=inst_pkg.root_config, |
287 |
type_name=inst_pkg.type_name) |
288 |
self._pkg_cache[uninst_task] = uninst_task |
289 |
# Enforce correct merge order with a hard dep. |
290 |
@@ -5300,9 +5336,10 @@ |
291 |
raise portage_exception.PackageNotFound(pkg_key) |
292 |
installed = action == "uninstall" |
293 |
built = pkg_type != "ebuild" |
294 |
+ root_config = self.roots[myroot] |
295 |
pkg = Package(built=built, cpv=pkg_key, |
296 |
installed=installed, metadata=metadata, |
297 |
- operation=action, root=myroot, |
298 |
+ operation=action, root_config=root_config, |
299 |
type_name=pkg_type) |
300 |
if pkg_type == "ebuild": |
301 |
pkgsettings = self.pkgsettings[myroot] |
302 |
@@ -5743,9 +5780,7 @@ |
303 |
for root in trees: |
304 |
self.pkgsettings[root] = portage.config( |
305 |
clone=trees[root]["vartree"].settings) |
306 |
- self._blocker_db[root] = BlockerDB( |
307 |
- trees[root]["vartree"], |
308 |
- trees[root]["porttree"].dbapi) |
309 |
+ self._blocker_db[root] = BlockerDB(trees[root]["root_config"]) |
310 |
self.curval = 0 |
311 |
self._spawned_pids = [] |
312 |
|
313 |
@@ -7677,11 +7712,11 @@ |
314 |
mydbapi=trees[settings["ROOT"]]["vartree"].dbapi, |
315 |
tree="vartree") |
316 |
|
317 |
-def action_search(settings, trees, myopts, myfiles, spinner): |
318 |
+def action_search(root_config, myopts, myfiles, spinner): |
319 |
if not myfiles: |
320 |
print "emerge: no search terms provided." |
321 |
else: |
322 |
- searchinstance = search(settings, trees, |
323 |
+ searchinstance = search(root_config, |
324 |
spinner, "--searchdesc" in myopts, |
325 |
"--quiet" not in myopts, "--usepkg" in myopts, |
326 |
"--usepkgonly" in myopts) |
327 |
@@ -7735,9 +7770,7 @@ |
328 |
dep_check_trees = {} |
329 |
dep_check_trees[myroot] = {} |
330 |
dep_check_trees[myroot]["vartree"] = \ |
331 |
- FakeVartree(trees[myroot]["vartree"], |
332 |
- trees[myroot]["porttree"].dbapi, |
333 |
- depgraph._mydbapi_keys, pkg_cache) |
334 |
+ FakeVartree(trees[myroot]["root_config"], pkg_cache=pkg_cache) |
335 |
vardb = dep_check_trees[myroot]["vartree"].dbapi |
336 |
# Constrain dependency selection to the installed packages. |
337 |
dep_check_trees[myroot]["porttree"] = dep_check_trees[myroot]["vartree"] |
338 |
@@ -9003,7 +9036,7 @@ |
339 |
# SEARCH action |
340 |
elif "search"==myaction: |
341 |
validate_ebuild_environment(trees) |
342 |
- action_search(settings, trees[settings["ROOT"]], |
343 |
+ action_search(trees[settings["ROOT"]]["root_config"], |
344 |
myopts, myfiles, spinner) |
345 |
elif myaction in ("clean", "unmerge") or \ |
346 |
(myaction == "prune" and "--nodeps" in myopts): |
347 |
|
348 |
-- |
349 |
gentoo-commits@l.g.o mailing list |