Gentoo Archives: gentoo-commits

From: "Fabian Groffen (grobian)" <grobian@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10458 - in main/branches/prefix/pym: _emerge portage portage/dbapi
Date: Tue, 27 May 2008 15:41:54
Message-Id: E1K11J7-0004Af-J1@stork.gentoo.org
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