1 |
Author: grobian |
2 |
Date: 2008-05-27 15:41:48 +0000 (Tue, 27 May 2008) |
3 |
New Revision: 10458 |
4 |
|
5 |
Modified: |
6 |
main/branches/prefix/pym/_emerge/__init__.py |
7 |
main/branches/prefix/pym/portage/__init__.py |
8 |
main/branches/prefix/pym/portage/dbapi/__init__.py |
9 |
main/branches/prefix/pym/portage/dep.py |
10 |
Log: |
11 |
Merged from trunk 10438:10455 |
12 |
|
13 |
| 10440 | Fix USE dep matching support in match_from_list() so that it | |
14 |
| zmedico | checks to make sure the package supports all specified IUSE. | |
15 |
| | This involves updating all Package, FakeVartree, and | |
16 |
| | BlockerDB constructor arguments to implement a | |
17 |
| | Package.root_config attribute that's used to access implicit | |
18 |
| | IUSE. | |
19 |
|
20 |
| 10441 | Define __slots__ for the _use_dep class. | |
21 |
| zmedico | | |
22 |
|
23 |
| 10443 | Fix breakage in the BlockerDB constructor. | |
24 |
| zmedico | | |
25 |
|
26 |
| 10445 | Fix dbapi._iter_match_use() to escape IUSE values when | |
27 |
| zmedico | necessary. | |
28 |
|
29 |
| 10446 | Repoman only checks IUSE for USE deps, so don't evaluate | |
30 |
| zmedico | conditional USE deps in this case. | |
31 |
|
32 |
| 10447 | Set Atom.use = None when there are no USE deps (instead of | |
33 |
| zmedico | the empty tuple returned from dep_getusedeps()). | |
34 |
|
35 |
| 10448 | Use new Package.use and iuse attributes to avoid extra | |
36 |
| zmedico | split() calls. | |
37 |
|
38 |
| 10450 | Fix a typo from the previous commit. | |
39 |
| zmedico | | |
40 |
|
41 |
| 10452 | Make config._init_dirs() preserver /tmp and /var/tmp | |
42 |
| zmedico | permissions if those directories already exist. This gives | |
43 |
| | freedom to the user to adjust permissions to suit their | |
44 |
| | taste. | |
45 |
|
46 |
| 10453 | Fix typo. | |
47 |
| zmedico | | |
48 |
|
49 |
| 10455 | Fix breakage due to frozenset being immutable. | |
50 |
| zmedico | | |
51 |
|
52 |
|
53 |
Modified: main/branches/prefix/pym/_emerge/__init__.py |
54 |
=================================================================== |
55 |
--- main/branches/prefix/pym/_emerge/__init__.py 2008-05-27 15:30:44 UTC (rev 10457) |
56 |
+++ main/branches/prefix/pym/_emerge/__init__.py 2008-05-27 15:41:48 UTC (rev 10458) |
57 |
@@ -414,6 +414,7 @@ |
58 |
self.spinner = spinner |
59 |
self.verbose = verbose |
60 |
self.searchdesc = searchdesc |
61 |
+ self.root_config = root_config |
62 |
self.setconfig = root_config.setconfig |
63 |
|
64 |
def fake_portdb(): |
65 |
@@ -485,7 +486,7 @@ |
66 |
elif built: |
67 |
pkg_type = "binary" |
68 |
return visible(self.settings, |
69 |
- Package(type_name=pkg_type, root=self.settings["ROOT"], |
70 |
+ Package(type_name=pkg_type, root_config=self.root_config, |
71 |
cpv=cpv, built=built, installed=installed, metadata=metadata)) |
72 |
|
73 |
def _xmatch(self, level, atom): |
74 |
@@ -744,6 +745,7 @@ |
75 |
def __init__(self, settings, trees, setconfig): |
76 |
self.trees = trees |
77 |
self.settings = settings |
78 |
+ self.iuse_implicit = tuple(sorted(settings._get_implicit_iuse())) |
79 |
self.root = self.settings["ROOT"] |
80 |
self.setconfig = setconfig |
81 |
self.sets = self.setconfig.getSets() |
82 |
@@ -756,7 +758,7 @@ |
83 |
in world since system atoms can only match one slot while world atoms can |
84 |
be greedy with respect to slots. Unslotted system packages will not be |
85 |
stored in world.""" |
86 |
- pkg = Package(cpv=pkg_key, metadata=metadata) |
87 |
+ pkg = Package(cpv=pkg_key, root_config=root_config, metadata=metadata) |
88 |
arg_atom = args_set.findAtomForPackage(pkg) |
89 |
if not arg_atom: |
90 |
return None |
91 |
@@ -992,11 +994,14 @@ |
92 |
user doesn't necessarily need write access to the vardb in cases where |
93 |
global updates are necessary (updates are performed when necessary if there |
94 |
is not a matching ebuild in the tree).""" |
95 |
- def __init__(self, real_vartree, portdb, |
96 |
- db_keys, pkg_cache, acquire_lock=1): |
97 |
+ def __init__(self, root_config, pkg_cache=None, acquire_lock=1): |
98 |
+ if pkg_cache is None: |
99 |
+ pkg_cache = {} |
100 |
+ real_vartree = root_config.trees["vartree"] |
101 |
+ portdb = root_config.trees["porttree"].dbapi |
102 |
self.root = real_vartree.root |
103 |
self.settings = real_vartree.settings |
104 |
- mykeys = db_keys[:] |
105 |
+ mykeys = list(Package.metadata_keys) |
106 |
for required_key in ("COUNTER", "SLOT"): |
107 |
if required_key not in mykeys: |
108 |
mykeys.append(required_key) |
109 |
@@ -1037,7 +1042,7 @@ |
110 |
if pkg is None: |
111 |
pkg = Package(built=True, cpv=cpv, |
112 |
installed=True, metadata=metadata, |
113 |
- root=self.root, type_name="installed") |
114 |
+ root_config=root_config, type_name="installed") |
115 |
self._pkg_cache[pkg] = pkg |
116 |
self.dbapi.cpv_inject(pkg) |
117 |
real_dbapi.flush_cache() |
118 |
@@ -1186,7 +1191,7 @@ |
119 |
if metadata is None: |
120 |
mreasons = ["corruption"] |
121 |
else: |
122 |
- pkg = Package(type_name=pkg_type, root=root_config.root, |
123 |
+ pkg = Package(type_name=pkg_type, root_config=root_config, |
124 |
cpv=cpv, built=built, installed=installed, metadata=metadata) |
125 |
mreasons = get_masking_status(pkg, pkgsettings, root_config) |
126 |
return metadata, mreasons |
127 |
@@ -1294,9 +1299,9 @@ |
128 |
class Package(Task): |
129 |
__slots__ = ("built", "cpv", "depth", |
130 |
"installed", "metadata", "onlydeps", "operation", |
131 |
- "root", "type_name", |
132 |
- "category", "cp", "cpv_split", |
133 |
- "pf", "pv_split", "slot", "slot_atom", "use") |
134 |
+ "root_config", "type_name", |
135 |
+ "category", "cp", "cpv_split", "iuse", |
136 |
+ "pf", "pv_split", "root", "slot", "slot_atom", "use") |
137 |
|
138 |
metadata_keys = [ |
139 |
"CHOST", "COUNTER", "DEPEND", "EAPI", "IUSE", "KEYWORDS", |
140 |
@@ -1305,6 +1310,7 @@ |
141 |
|
142 |
def __init__(self, **kwargs): |
143 |
Task.__init__(self, **kwargs) |
144 |
+ self.root = self.root_config.root |
145 |
self.metadata = self._metadata_wrapper(self, self.metadata) |
146 |
self.cp = portage.cpv_getkey(self.cpv) |
147 |
self.slot_atom = portage.dep.Atom("%s:%s" % (self.cp, self.slot)) |
148 |
@@ -1313,13 +1319,51 @@ |
149 |
self.pv_split = self.cpv_split[1:] |
150 |
|
151 |
class _use(object): |
152 |
+ |
153 |
+ __slots__ = ("__weakref__", "enabled") |
154 |
+ |
155 |
def __init__(self, use): |
156 |
self.enabled = frozenset(use) |
157 |
|
158 |
+ class _iuse(object): |
159 |
+ |
160 |
+ __slots__ = ("__weakref__", "all", "enabled", "disabled", "iuse_implicit", "regex", "tokens") |
161 |
+ |
162 |
+ def __init__(self, tokens, iuse_implicit): |
163 |
+ self.tokens = tuple(tokens) |
164 |
+ self.iuse_implicit = iuse_implicit |
165 |
+ enabled = [] |
166 |
+ disabled = [] |
167 |
+ other = [] |
168 |
+ for x in tokens: |
169 |
+ prefix = x[:1] |
170 |
+ if prefix == "+": |
171 |
+ enabled.append(x[1:]) |
172 |
+ elif prefix == "-": |
173 |
+ disabled.append(x[1:]) |
174 |
+ else: |
175 |
+ other.append(x) |
176 |
+ self.enabled = frozenset(enabled) |
177 |
+ self.disabled = frozenset(disabled) |
178 |
+ self.all = frozenset(chain(enabled, disabled, other)) |
179 |
+ |
180 |
+ def __getattribute__(self, name): |
181 |
+ if name == "regex": |
182 |
+ try: |
183 |
+ return object.__getattribute__(self, "regex") |
184 |
+ except AttributeError: |
185 |
+ all = object.__getattribute__(self, "all") |
186 |
+ iuse_implicit = object.__getattribute__(self, "iuse_implicit") |
187 |
+ self.regex = re.compile("^(%s)$" % "|".join( |
188 |
+ chain((re.escape(x) for x in all), iuse_implicit))) |
189 |
+ return object.__getattribute__(self, name) |
190 |
+ |
191 |
class _metadata_wrapper(dict): |
192 |
""" |
193 |
Detect metadata updates and synchronize Package attributes. |
194 |
""" |
195 |
+ _wrapped_keys = frozenset(["IUSE", "SLOT", "USE"]) |
196 |
+ |
197 |
def __init__(self, pkg, metadata): |
198 |
dict.__init__(self) |
199 |
self._pkg = pkg |
200 |
@@ -1333,11 +1377,19 @@ |
201 |
|
202 |
def __setitem__(self, k, v): |
203 |
dict.__setitem__(self, k, v) |
204 |
- if k == "USE": |
205 |
- self._pkg.use = self._pkg._use(v.split()) |
206 |
- elif k == "SLOT": |
207 |
- self._pkg.slot = v |
208 |
+ if k in self._wrapped_keys: |
209 |
+ getattr(self, "_set_" + k.lower())(k, v) |
210 |
|
211 |
+ def _set_iuse(self, k, v): |
212 |
+ self._pkg.iuse = self._pkg._iuse( |
213 |
+ v.split(), self._pkg.root_config.iuse_implicit) |
214 |
+ |
215 |
+ def _set_slot(self, k, v): |
216 |
+ self._pkg.slot = v |
217 |
+ |
218 |
+ def _set_use(self, k, v): |
219 |
+ self._pkg.use = self._pkg._use(v.split()) |
220 |
+ |
221 |
def _get_hash_key(self): |
222 |
hash_key = getattr(self, "_hash_key", None) |
223 |
if hash_key is None: |
224 |
@@ -1574,11 +1626,12 @@ |
225 |
|
226 |
class BlockerDB(object): |
227 |
|
228 |
- def __init__(self, vartree, portdb): |
229 |
- self._vartree = vartree |
230 |
- self._portdb = portdb |
231 |
+ def __init__(self, root_config): |
232 |
+ self._root_config = root_config |
233 |
+ self._vartree = root_config.trees["vartree"] |
234 |
+ self._portdb = root_config.trees["porttree"].dbapi |
235 |
self._blocker_cache = \ |
236 |
- BlockerCache(self._vartree.root, vartree.dbapi) |
237 |
+ BlockerCache(self._vartree.root, self._vartree.dbapi) |
238 |
self._dep_check_trees = { self._vartree.root : { |
239 |
"porttree" : self._vartree, |
240 |
"vartree" : self._vartree, |
241 |
@@ -1591,9 +1644,7 @@ |
242 |
settings = self._vartree.settings |
243 |
stale_cache = set(blocker_cache) |
244 |
fake_vartree = \ |
245 |
- FakeVartree(self._vartree, |
246 |
- self._portdb, Package.metadata_keys, {}, |
247 |
- acquire_lock=acquire_lock) |
248 |
+ FakeVartree(self._root_config, acquire_lock=acquire_lock) |
249 |
vardb = fake_vartree.dbapi |
250 |
installed_pkgs = list(vardb) |
251 |
|
252 |
@@ -1606,14 +1657,13 @@ |
253 |
if cached_blockers is not None: |
254 |
blocker_atoms = cached_blockers.atoms |
255 |
else: |
256 |
- myuse = inst_pkg.metadata["USE"].split() |
257 |
# Use aux_get() to trigger FakeVartree global |
258 |
# updates on *DEPEND when appropriate. |
259 |
depstr = " ".join(vardb.aux_get(inst_pkg.cpv, dep_keys)) |
260 |
try: |
261 |
portage.dep._dep_check_strict = False |
262 |
success, atoms = portage.dep_check(depstr, |
263 |
- vardb, settings, myuse=myuse, |
264 |
+ vardb, settings, myuse=inst_pkg.use.enabled, |
265 |
trees=dep_check_trees, myroot=inst_pkg.root) |
266 |
finally: |
267 |
portage.dep._dep_check_strict = True |
268 |
@@ -1648,12 +1698,11 @@ |
269 |
blocking_pkgs.update(blocker_parents.parent_nodes(atom)) |
270 |
|
271 |
# Check for blockers in the other direction. |
272 |
- myuse = new_pkg.metadata["USE"].split() |
273 |
depstr = " ".join(new_pkg.metadata[k] for k in dep_keys) |
274 |
try: |
275 |
portage.dep._dep_check_strict = False |
276 |
success, atoms = portage.dep_check(depstr, |
277 |
- vardb, settings, myuse=myuse, |
278 |
+ vardb, settings, myuse=new_pkg.use.enabled, |
279 |
trees=dep_check_trees, myroot=new_pkg.root) |
280 |
finally: |
281 |
portage.dep._dep_check_strict = True |
282 |
@@ -1869,9 +1918,8 @@ |
283 |
for tree in ("porttree", "bintree"): |
284 |
self.trees[myroot][tree] = trees[myroot][tree] |
285 |
self.trees[myroot]["vartree"] = \ |
286 |
- FakeVartree(trees[myroot]["vartree"], |
287 |
- trees[myroot]["porttree"].dbapi, |
288 |
- self._mydbapi_keys, self._pkg_cache) |
289 |
+ FakeVartree(trees[myroot]["root_config"], |
290 |
+ pkg_cache=self._pkg_cache) |
291 |
self.pkgsettings[myroot] = portage.config( |
292 |
clone=self.trees[myroot]["vartree"].settings) |
293 |
self._slot_pkg_map[myroot] = {} |
294 |
@@ -1882,14 +1930,10 @@ |
295 |
# have after new packages have been installed. |
296 |
fakedb = PackageVirtualDbapi(vardb.settings) |
297 |
if preload_installed_pkgs: |
298 |
- for cpv in vardb.cpv_all(): |
299 |
+ for pkg in vardb: |
300 |
self.spinner.update() |
301 |
- metadata = dict(izip(self._mydbapi_keys, |
302 |
- vardb.aux_get(cpv, self._mydbapi_keys))) |
303 |
- pkg = Package(built=True, cpv=cpv, |
304 |
- installed=True, metadata=metadata, |
305 |
- root=myroot, type_name="installed") |
306 |
- self._pkg_cache[pkg] = pkg |
307 |
+ # This triggers metadata updates via FakeVartree. |
308 |
+ vardb.aux_get(pkg.cpv, []) |
309 |
fakedb.cpv_inject(pkg) |
310 |
self.mydbapi[myroot] = fakedb |
311 |
def graph_tree(): |
312 |
@@ -2089,8 +2133,8 @@ |
313 |
"""Return a set of flags that trigger reinstallation, or None if there |
314 |
are no such flags.""" |
315 |
if "--newuse" in self.myopts: |
316 |
- flags = orig_iuse.symmetric_difference( |
317 |
- cur_iuse).difference(forced_flags) |
318 |
+ flags = set(orig_iuse.symmetric_difference( |
319 |
+ cur_iuse).difference(forced_flags)) |
320 |
flags.update(orig_iuse.intersection(orig_use).symmetric_difference( |
321 |
cur_iuse.intersection(cur_use))) |
322 |
if flags: |
323 |
@@ -2327,7 +2371,7 @@ |
324 |
myroot = pkg.root |
325 |
mykey = pkg.cpv |
326 |
metadata = pkg.metadata |
327 |
- myuse = metadata["USE"].split() |
328 |
+ myuse = pkg.use.enabled |
329 |
jbigkey = pkg |
330 |
depth = pkg.depth + 1 |
331 |
|
332 |
@@ -2533,7 +2577,7 @@ |
333 |
return 0, myfavorites |
334 |
metadata = dict(izip(self._mydbapi_keys, |
335 |
bindb.aux_get(mykey, self._mydbapi_keys))) |
336 |
- pkg = Package(type_name="binary", root=myroot, |
337 |
+ pkg = Package(type_name="binary", root_config=root_config, |
338 |
cpv=mykey, built=True, metadata=metadata, |
339 |
onlydeps=onlydeps) |
340 |
self._pkg_cache[pkg] = pkg |
341 |
@@ -2573,7 +2617,7 @@ |
342 |
portdb.aux_get(mykey, self._mydbapi_keys))) |
343 |
pkgsettings.setcpv(mykey, mydb=metadata) |
344 |
metadata["USE"] = pkgsettings["PORTAGE_USE"] |
345 |
- pkg = Package(type_name="ebuild", root=myroot, |
346 |
+ pkg = Package(type_name="ebuild", root_config=root_config, |
347 |
cpv=mykey, metadata=metadata, onlydeps=onlydeps) |
348 |
self._pkg_cache[pkg] = pkg |
349 |
args.append(PackageArg(arg=x, package=pkg, |
350 |
@@ -2922,7 +2966,8 @@ |
351 |
pkgsettings, db, pkg_type, built, installed, db_keys) |
352 |
if atom.use and not mreasons: |
353 |
missing_use.append(Package(built=built, cpv=cpv, |
354 |
- installed=installed, metadata=metadata, root=root)) |
355 |
+ installed=installed, metadata=metadata, |
356 |
+ root_config=root_config)) |
357 |
else: |
358 |
masked_packages.append( |
359 |
(root_config, pkgsettings, cpv, metadata, mreasons)) |
360 |
@@ -2930,9 +2975,8 @@ |
361 |
missing_use_reasons = [] |
362 |
missing_iuse_reasons = [] |
363 |
for pkg in missing_use: |
364 |
- use = pkg.metadata["USE"].split() |
365 |
- iuse = implicit_iuse.union(x.lstrip("+-") \ |
366 |
- for x in pkg.metadata["IUSE"].split()) |
367 |
+ use = pkg.use.enabled |
368 |
+ iuse = implicit_iuse.union(re.escape(x) for x in pkg.iuse.all) |
369 |
iuse_re = re.compile("^(%s)$" % "|".join(iuse)) |
370 |
missing_iuse = [] |
371 |
for x in atom.use.required: |
372 |
@@ -3009,6 +3053,7 @@ |
373 |
return ret |
374 |
|
375 |
def _select_pkg_highest_available_imp(self, root, atom, onlydeps=False): |
376 |
+ root_config = self.roots[root] |
377 |
pkgsettings = self.pkgsettings[root] |
378 |
dbs = self._filtered_trees[root]["dbs"] |
379 |
vardb = self.roots[root].trees["vartree"].dbapi |
380 |
@@ -3094,7 +3139,8 @@ |
381 |
continue |
382 |
pkg = Package(built=built, cpv=cpv, |
383 |
installed=installed, metadata=metadata, |
384 |
- onlydeps=onlydeps, root=root, type_name=pkg_type) |
385 |
+ onlydeps=onlydeps, root_config=root_config, |
386 |
+ type_name=pkg_type) |
387 |
metadata = pkg.metadata |
388 |
if not built and ("?" in metadata["LICENSE"] or \ |
389 |
"?" in metadata["PROVIDE"]): |
390 |
@@ -3161,7 +3207,7 @@ |
391 |
found_available_arg = True |
392 |
|
393 |
if atom.use and not pkg.built: |
394 |
- use = pkg.metadata["USE"].split() |
395 |
+ use = pkg.use.enabled |
396 |
if atom.use.enabled.difference(use): |
397 |
continue |
398 |
if atom.use.disabled.intersection(use): |
399 |
@@ -3198,8 +3244,7 @@ |
400 |
if built and not installed and \ |
401 |
("--newuse" in self.myopts or \ |
402 |
"--reinstall" in self.myopts): |
403 |
- iuses = set(filter_iuse_defaults( |
404 |
- pkg.metadata["IUSE"].split())) |
405 |
+ iuses = pkg.iuse.all |
406 |
old_use = pkg.use.enabled |
407 |
if myeb: |
408 |
pkgsettings.setcpv(myeb) |
409 |
@@ -3211,8 +3256,7 @@ |
410 |
forced_flags.update(pkgsettings.usemask) |
411 |
cur_iuse = iuses |
412 |
if myeb and not usepkgonly: |
413 |
- cur_iuse = set(filter_iuse_defaults( |
414 |
- myeb.metadata["IUSE"].split())) |
415 |
+ cur_iuse = myeb.iuse.all |
416 |
if self._reinstall_for_flags(forced_flags, |
417 |
old_use, iuses, |
418 |
now_use, cur_iuse): |
419 |
@@ -3231,8 +3275,7 @@ |
420 |
old_iuse = set(filter_iuse_defaults( |
421 |
vardb.aux_get(cpv, ["IUSE"])[0].split())) |
422 |
cur_use = pkgsettings["PORTAGE_USE"].split() |
423 |
- cur_iuse = set(filter_iuse_defaults( |
424 |
- pkg.metadata["IUSE"].split())) |
425 |
+ cur_iuse = pkg.iuse.all |
426 |
reinstall_for_flags = \ |
427 |
self._reinstall_for_flags( |
428 |
forced_flags, old_use, old_iuse, |
429 |
@@ -3466,7 +3509,6 @@ |
430 |
if blocker_data: |
431 |
blocker_atoms = blocker_data.atoms |
432 |
else: |
433 |
- myuse = pkg.metadata["USE"].split() |
434 |
# Use aux_get() to trigger FakeVartree global |
435 |
# updates on *DEPEND when appropriate. |
436 |
depstr = " ".join(vardb.aux_get(pkg.cpv, dep_keys)) |
437 |
@@ -3477,7 +3519,7 @@ |
438 |
portage.dep._dep_check_strict = False |
439 |
try: |
440 |
success, atoms = portage.dep_check(depstr, |
441 |
- final_db, pkgsettings, myuse=myuse, |
442 |
+ final_db, pkgsettings, myuse=pkg.use.enabled, |
443 |
trees=self._graph_trees, myroot=myroot) |
444 |
except Exception, e: |
445 |
if isinstance(e, SystemExit): |
446 |
@@ -3626,7 +3668,8 @@ |
447 |
uninst_task = Package(built=inst_pkg.built, |
448 |
cpv=inst_pkg.cpv, installed=inst_pkg.installed, |
449 |
metadata=inst_pkg.metadata, |
450 |
- operation="uninstall", root=inst_pkg.root, |
451 |
+ operation="uninstall", |
452 |
+ root_config=inst_pkg.root_config, |
453 |
type_name=inst_pkg.type_name) |
454 |
self._pkg_cache[uninst_task] = uninst_task |
455 |
# Enforce correct merge order with a hard dep. |
456 |
@@ -3778,7 +3821,7 @@ |
457 |
try: |
458 |
portage_rdepend = self._select_atoms_highest_available( |
459 |
running_root, running_portage.metadata["RDEPEND"], |
460 |
- myuse=running_portage.metadata["USE"].split(), |
461 |
+ myuse=running_portage.use.enabled, |
462 |
parent=running_portage, strict=False) |
463 |
except portage.exception.InvalidDependString, e: |
464 |
portage.writemsg("!!! Invalid RDEPEND in " + \ |
465 |
@@ -4590,7 +4633,7 @@ |
466 |
repo_path_real = repo_name |
467 |
else: |
468 |
repo_path_real = portdb.getRepositoryPath(repo_name) |
469 |
- pkg_use = metadata["USE"].split() |
470 |
+ pkg_use = list(pkg.use.enabled) |
471 |
try: |
472 |
restrict = flatten(use_reduce(paren_reduce( |
473 |
pkg.metadata["RESTRICT"]), uselist=pkg_use)) |
474 |
@@ -4670,18 +4713,15 @@ |
475 |
|
476 |
if True: |
477 |
# USE flag display |
478 |
- cur_iuse = list(filter_iuse_defaults( |
479 |
- pkg.metadata["IUSE"].split())) |
480 |
- |
481 |
forced_flags = set() |
482 |
- pkgsettings.setcpv(pkg.cpv, mydb=pkg.metadata) # for package.use.{mask,force} |
483 |
+ pkgsettings.setcpv(pkg) # for package.use.{mask,force} |
484 |
forced_flags.update(pkgsettings.useforce) |
485 |
forced_flags.update(pkgsettings.usemask) |
486 |
|
487 |
- cur_iuse = portage.unique_array(cur_iuse) |
488 |
+ cur_iuse = list(pkg.iuse.all) |
489 |
cur_iuse.sort() |
490 |
- cur_use = pkg_use |
491 |
- cur_use = [flag for flag in cur_use if flag in cur_iuse] |
492 |
+ cur_use = [flag for flag in pkg.use.enabled \ |
493 |
+ if flag in cur_iuse] |
494 |
|
495 |
if myoldbest and myinslotlist: |
496 |
previous_cpv = myoldbest[0] |
497 |
@@ -5243,9 +5283,10 @@ |
498 |
raise portage.exception.PackageNotFound(pkg_key) |
499 |
installed = action == "uninstall" |
500 |
built = pkg_type != "ebuild" |
501 |
+ root_config = self.roots[myroot] |
502 |
pkg = Package(built=built, cpv=pkg_key, |
503 |
installed=installed, metadata=metadata, |
504 |
- operation=action, root=myroot, |
505 |
+ operation=action, root_config=root_config, |
506 |
type_name=pkg_type) |
507 |
if pkg_type == "ebuild": |
508 |
pkgsettings = self.pkgsettings[myroot] |
509 |
@@ -5691,9 +5732,7 @@ |
510 |
for root in trees: |
511 |
self.pkgsettings[root] = portage.config( |
512 |
clone=trees[root]["vartree"].settings) |
513 |
- self._blocker_db[root] = BlockerDB( |
514 |
- trees[root]["vartree"], |
515 |
- trees[root]["porttree"].dbapi) |
516 |
+ self._blocker_db[root] = BlockerDB(trees[root]["root_config"]) |
517 |
self.curval = 0 |
518 |
self._spawned_pids = [] |
519 |
|
520 |
@@ -7878,9 +7917,7 @@ |
521 |
dep_check_trees = {} |
522 |
dep_check_trees[myroot] = {} |
523 |
dep_check_trees[myroot]["vartree"] = \ |
524 |
- FakeVartree(trees[myroot]["vartree"], |
525 |
- trees[myroot]["porttree"].dbapi, |
526 |
- depgraph._mydbapi_keys, pkg_cache) |
527 |
+ FakeVartree(trees[myroot]["root_config"], pkg_cache=pkg_cache) |
528 |
vardb = dep_check_trees[myroot]["vartree"].dbapi |
529 |
# Constrain dependency selection to the installed packages. |
530 |
dep_check_trees[myroot]["porttree"] = dep_check_trees[myroot]["vartree"] |
531 |
|
532 |
Modified: main/branches/prefix/pym/portage/__init__.py |
533 |
=================================================================== |
534 |
--- main/branches/prefix/pym/portage/__init__.py 2008-05-27 15:30:44 UTC (rev 10457) |
535 |
+++ main/branches/prefix/pym/portage/__init__.py 2008-05-27 15:41:48 UTC (rev 10458) |
536 |
@@ -1678,16 +1678,23 @@ |
537 |
if not os.access(self["ROOT"] + EPREFIX_LSTRIP, os.W_OK): |
538 |
return |
539 |
|
540 |
+ # gid, mode, mask, preserve_perms |
541 |
dir_mode_map = { |
542 |
- EPREFIX_LSTRIP+"/tmp" : (-1, 01777, 0), |
543 |
- EPREFIX_LSTRIP+"/var/tmp" : (-1, 01777, 0), |
544 |
- PRIVATE_PATH : (portage_gid, 02750, 02), |
545 |
- CACHE_PATH.lstrip(os.path.sep) : (portage_gid, 0755, 02) |
546 |
+ EPREFIX_LSTRIP+"tmp" : ( -1, 01777, 0, True), |
547 |
+ EPREFIX_LSTRIP+"var/tmp" : ( -1, 01777, 0, True), |
548 |
+ PRIVATE_PATH : ( portage_gid, 02750, 02, False), |
549 |
+ CACHE_PATH.lstrip(os.path.sep) : (portage_gid, 0755, 02, False) |
550 |
} |
551 |
|
552 |
- for mypath, (gid, mode, modemask) in dir_mode_map.iteritems(): |
553 |
+ for mypath, (gid, mode, modemask, preserve_perms) \ |
554 |
+ in dir_mode_map.iteritems(): |
555 |
+ mydir = os.path.join(self["ROOT"], mypath) |
556 |
+ if preserve_perms and os.path.isdir(mydir): |
557 |
+ # Only adjust permissions on some directories if |
558 |
+ # they don't exist yet. This gives freedom to the |
559 |
+ # user to adjust permissions to suit their taste. |
560 |
+ continue |
561 |
try: |
562 |
- mydir = normalize_path(os.path.join(self["ROOT"], mypath)) |
563 |
portage.util.ensure_dirs(mydir, gid=gid, mode=mode, mask=modemask) |
564 |
except portage.exception.PortageException, e: |
565 |
writemsg("!!! Directory initialization failed: '%s'\n" % mydir, |
566 |
@@ -5458,6 +5465,7 @@ |
567 |
# for new-style virtuals. Repoman should enforce this. |
568 |
dep_keys = ["RDEPEND", "DEPEND", "PDEPEND"] |
569 |
portdb = trees[myroot]["porttree"].dbapi |
570 |
+ repoman = isinstance(mydbapi, portdbapi) |
571 |
if kwargs["use_binaries"]: |
572 |
portdb = trees[myroot]["bintree"].dbapi |
573 |
myvirtuals = mysettings.getvirtuals() |
574 |
@@ -5479,7 +5487,10 @@ |
575 |
raise portage.exception.ParseError( |
576 |
"invalid atom: '%s'" % x) |
577 |
|
578 |
- if isinstance(x, portage.dep.Atom) and x.use: |
579 |
+ # Repoman only checks IUSE for USE deps, so there's |
580 |
+ # no need to evaluate conditionals. |
581 |
+ if not repoman and \ |
582 |
+ myuse is not None and isinstance(x, portage.dep.Atom) and x.use: |
583 |
if x.use.conditional: |
584 |
evaluated_atom = portage.dep.remove_slot(x) |
585 |
if x.slot: |
586 |
|
587 |
Modified: main/branches/prefix/pym/portage/dbapi/__init__.py |
588 |
=================================================================== |
589 |
--- main/branches/prefix/pym/portage/dbapi/__init__.py 2008-05-27 15:30:44 UTC (rev 10457) |
590 |
+++ main/branches/prefix/pym/portage/dbapi/__init__.py 2008-05-27 15:41:48 UTC (rev 10458) |
591 |
@@ -149,7 +149,7 @@ |
592 |
iuse, use = self.aux_get(cpv, ["IUSE", "USE"]) |
593 |
use = use.split() |
594 |
iuse = self._iuse_implicit.union( |
595 |
- x.lstrip("+-") for x in iuse.split()) |
596 |
+ re.escape(x.lstrip("+-")) for x in iuse.split()) |
597 |
iuse_re = re.compile("^(%s)$" % "|".join(iuse)) |
598 |
missing_iuse = False |
599 |
for x in atom.use.required: |
600 |
|
601 |
Modified: main/branches/prefix/pym/portage/dep.py |
602 |
=================================================================== |
603 |
--- main/branches/prefix/pym/portage/dep.py 2008-05-27 15:30:44 UTC (rev 10457) |
604 |
+++ main/branches/prefix/pym/portage/dep.py 2008-05-27 15:41:48 UTC (rev 10458) |
605 |
@@ -338,6 +338,10 @@ |
606 |
return retlist |
607 |
|
608 |
class _use_dep(object): |
609 |
+ |
610 |
+ __slots__ = ("__weakref__", "conditional", "conditional_disabled", |
611 |
+ "conditional_enabled", "disabled", "enabled", "tokens", "required") |
612 |
+ |
613 |
def __init__(self, use): |
614 |
enabled_flags = [] |
615 |
disabled_flags = [] |
616 |
@@ -405,6 +409,8 @@ |
617 |
self.use = dep_getusedeps(s) |
618 |
if self.use: |
619 |
self.use = _use_dep(self.use) |
620 |
+ else: |
621 |
+ self.use = None |
622 |
|
623 |
def get_operator(mydep): |
624 |
""" |
625 |
@@ -890,11 +896,16 @@ |
626 |
candidate_list = mylist |
627 |
mylist = [] |
628 |
for x in candidate_list: |
629 |
- # Note: IUSE intersection is neglected here since there |
630 |
- # is currently no way to access implicit IUSE. However, IUSE |
631 |
- # filtering can be added elsewhere in the chain. |
632 |
use = getattr(x, "use", None) |
633 |
if use is not None: |
634 |
+ regex = x.iuse.regex |
635 |
+ missing_iuse = False |
636 |
+ for y in mydep.use.required: |
637 |
+ if regex.match(y) is None: |
638 |
+ missing_iuse = True |
639 |
+ break |
640 |
+ if missing_iuse: |
641 |
+ continue |
642 |
if mydep.use.enabled.difference(use.enabled): |
643 |
continue |
644 |
if mydep.use.disabled.intersection(use.enabled): |
645 |
|
646 |
-- |
647 |
gentoo-commits@l.g.o mailing list |