Lines 23-28
Link Here
|
23 |
from portage.dep import Atom, best_match_to_list, extract_affecting_use, \ |
23 |
from portage.dep import Atom, best_match_to_list, extract_affecting_use, \ |
24 |
check_required_use, human_readable_required_use, match_from_list, \ |
24 |
check_required_use, human_readable_required_use, match_from_list, \ |
25 |
_repo_separator |
25 |
_repo_separator |
|
|
26 |
from portage.dep.dep_check import ro_selected |
26 |
from portage.dep._slot_operator import ignore_built_slot_operator_deps |
27 |
from portage.dep._slot_operator import ignore_built_slot_operator_deps |
27 |
from portage.eapi import eapi_has_strong_blocks, eapi_has_required_use, \ |
28 |
from portage.eapi import eapi_has_strong_blocks, eapi_has_required_use, \ |
28 |
_get_eapi_attrs |
29 |
_get_eapi_attrs |
Lines 2231-2237
Link Here
|
2231 |
edepend["HDEPEND"] = "" |
2232 |
edepend["HDEPEND"] = "" |
2232 |
|
2233 |
|
2233 |
deps = ( |
2234 |
deps = ( |
2234 |
(depend_root, edepend["DEPEND"], |
2235 |
(depend_root, "DEPEND", |
2235 |
self._priority(buildtime=True, |
2236 |
self._priority(buildtime=True, |
2236 |
optional=(pkg.built or ignore_depend_deps), |
2237 |
optional=(pkg.built or ignore_depend_deps), |
2237 |
ignored=ignore_depend_deps)), |
2238 |
ignored=ignore_depend_deps)), |
Lines 2239-2253
Link Here
|
2239 |
self._priority(buildtime=True, |
2240 |
self._priority(buildtime=True, |
2240 |
optional=(pkg.built or ignore_hdepend_deps), |
2241 |
optional=(pkg.built or ignore_hdepend_deps), |
2241 |
ignored=ignore_hdepend_deps)), |
2242 |
ignored=ignore_hdepend_deps)), |
2242 |
(myroot, edepend["RDEPEND"], |
2243 |
(myroot, "RDEPEND", |
2243 |
self._priority(runtime=True)), |
2244 |
self._priority(runtime=True)), |
2244 |
(myroot, edepend["PDEPEND"], |
2245 |
(myroot, "PDEPEND", |
2245 |
self._priority(runtime_post=True)) |
2246 |
self._priority(runtime_post=True)) |
2246 |
) |
2247 |
) |
2247 |
|
2248 |
|
2248 |
debug = "--debug" in self._frozen_config.myopts |
2249 |
debug = "--debug" in self._frozen_config.myopts |
2249 |
|
2250 |
|
2250 |
for dep_root, dep_string, dep_priority in deps: |
2251 |
for dep_root, dep_type, dep_priority in deps: |
|
|
2252 |
dep_string="" |
2253 |
if dep_type and edepend[dep_type]: |
2254 |
dep_string = edepend[dep_type] |
2251 |
if not dep_string: |
2255 |
if not dep_string: |
2252 |
continue |
2256 |
continue |
2253 |
if debug: |
2257 |
if debug: |
Lines 2285-2291
Link Here
|
2285 |
|
2289 |
|
2286 |
try: |
2290 |
try: |
2287 |
dep_string = list(self._queue_disjunctive_deps( |
2291 |
dep_string = list(self._queue_disjunctive_deps( |
2288 |
pkg, dep_root, dep_priority, dep_string)) |
2292 |
pkg, dep_root, dep_priority, dep_string, dep_type)) |
2289 |
except portage.exception.InvalidDependString as e: |
2293 |
except portage.exception.InvalidDependString as e: |
2290 |
if pkg.installed: |
2294 |
if pkg.installed: |
2291 |
self._dynamic_config._masked_installed.add(pkg) |
2295 |
self._dynamic_config._masked_installed.add(pkg) |
Lines 2300-2313
Link Here
|
2300 |
|
2304 |
|
2301 |
if not self._add_pkg_dep_string( |
2305 |
if not self._add_pkg_dep_string( |
2302 |
pkg, dep_root, dep_priority, dep_string, |
2306 |
pkg, dep_root, dep_priority, dep_string, |
2303 |
allow_unsatisfied): |
2307 |
allow_unsatisfied, dep_type=dep_type): |
2304 |
return 0 |
2308 |
return 0 |
2305 |
|
2309 |
|
2306 |
self._dynamic_config._traversed_pkg_deps.add(pkg) |
2310 |
self._dynamic_config._traversed_pkg_deps.add(pkg) |
2307 |
return 1 |
2311 |
return 1 |
2308 |
|
2312 |
|
2309 |
def _add_pkg_dep_string(self, pkg, dep_root, dep_priority, dep_string, |
2313 |
def _add_pkg_dep_string(self, pkg, dep_root, dep_priority, dep_string, |
2310 |
allow_unsatisfied): |
2314 |
allow_unsatisfied, dep_type=None): |
2311 |
_autounmask_backup = self._dynamic_config._autounmask |
2315 |
_autounmask_backup = self._dynamic_config._autounmask |
2312 |
if dep_priority.optional or dep_priority.ignored: |
2316 |
if dep_priority.optional or dep_priority.ignored: |
2313 |
# Temporarily disable autounmask for deps that |
2317 |
# Temporarily disable autounmask for deps that |
Lines 2352-2358
Link Here
|
2352 |
not slot_operator_rebuild |
2356 |
not slot_operator_rebuild |
2353 |
|
2357 |
|
2354 |
def _wrapped_add_pkg_dep_string(self, pkg, dep_root, dep_priority, |
2358 |
def _wrapped_add_pkg_dep_string(self, pkg, dep_root, dep_priority, |
2355 |
dep_string, allow_unsatisfied): |
2359 |
dep_string, allow_unsatisfied, dep_type=None): |
2356 |
depth = pkg.depth + 1 |
2360 |
depth = pkg.depth + 1 |
2357 |
deep = self._dynamic_config.myparams.get("deep", 0) |
2361 |
deep = self._dynamic_config.myparams.get("deep", 0) |
2358 |
recurse_satisfied = deep is True or depth <= deep |
2362 |
recurse_satisfied = deep is True or depth <= deep |
Lines 2372-2378
Link Here
|
2372 |
try: |
2376 |
try: |
2373 |
selected_atoms = self._select_atoms(dep_root, |
2377 |
selected_atoms = self._select_atoms(dep_root, |
2374 |
dep_string, myuse=self._pkg_use_enabled(pkg), parent=pkg, |
2378 |
dep_string, myuse=self._pkg_use_enabled(pkg), parent=pkg, |
2375 |
strict=strict, priority=dep_priority) |
2379 |
strict=strict, priority=dep_priority, dep_type=dep_type) |
2376 |
except portage.exception.InvalidDependString: |
2380 |
except portage.exception.InvalidDependString: |
2377 |
if pkg.installed: |
2381 |
if pkg.installed: |
2378 |
self._dynamic_config._masked_installed.add(pkg) |
2382 |
self._dynamic_config._masked_installed.add(pkg) |
Lines 2670-2676
Link Here
|
2670 |
child_pkgs.sort() |
2674 |
child_pkgs.sort() |
2671 |
yield (atom, child_pkgs[-1]) |
2675 |
yield (atom, child_pkgs[-1]) |
2672 |
|
2676 |
|
2673 |
def _queue_disjunctive_deps(self, pkg, dep_root, dep_priority, dep_struct): |
2677 |
def _queue_disjunctive_deps(self, pkg, dep_root, dep_priority, dep_struct, dep_type=None): |
2674 |
""" |
2678 |
""" |
2675 |
Queue disjunctive (virtual and ||) deps in self._dynamic_config._dep_disjunctive_stack. |
2679 |
Queue disjunctive (virtual and ||) deps in self._dynamic_config._dep_disjunctive_stack. |
2676 |
Yields non-disjunctive deps. Raises InvalidDependString when |
2680 |
Yields non-disjunctive deps. Raises InvalidDependString when |
Lines 2679-2711
Link Here
|
2679 |
for x in dep_struct: |
2683 |
for x in dep_struct: |
2680 |
if isinstance(x, list): |
2684 |
if isinstance(x, list): |
2681 |
if x and x[0] == "||": |
2685 |
if x and x[0] == "||": |
2682 |
self._queue_disjunction(pkg, dep_root, dep_priority, [x]) |
2686 |
self._queue_disjunction(pkg, dep_root, dep_priority, [x], dep_type) |
2683 |
else: |
2687 |
else: |
2684 |
for y in self._queue_disjunctive_deps( |
2688 |
for y in self._queue_disjunctive_deps( |
2685 |
pkg, dep_root, dep_priority, x): |
2689 |
pkg, dep_root, dep_priority, x, dep_type): |
2686 |
yield y |
2690 |
yield y |
2687 |
else: |
2691 |
else: |
2688 |
# Note: Eventually this will check for PROPERTIES=virtual |
2692 |
# Note: Eventually this will check for PROPERTIES=virtual |
2689 |
# or whatever other metadata gets implemented for this |
2693 |
# or whatever other metadata gets implemented for this |
2690 |
# purpose. |
2694 |
# purpose. |
2691 |
if x.cp.startswith('virtual/'): |
2695 |
if x.cp.startswith('virtual/'): |
2692 |
self._queue_disjunction(pkg, dep_root, dep_priority, [x]) |
2696 |
self._queue_disjunction(pkg, dep_root, dep_priority, [x], dep_type) |
2693 |
else: |
2697 |
else: |
2694 |
yield x |
2698 |
yield x |
2695 |
|
2699 |
|
2696 |
def _queue_disjunction(self, pkg, dep_root, dep_priority, dep_struct): |
2700 |
def _queue_disjunction(self, pkg, dep_root, dep_priority, dep_struct, dep_type=None): |
2697 |
self._dynamic_config._dep_disjunctive_stack.append( |
2701 |
self._dynamic_config._dep_disjunctive_stack.append( |
2698 |
(pkg, dep_root, dep_priority, dep_struct)) |
2702 |
(pkg, dep_root, dep_priority, dep_struct, dep_type)) |
2699 |
|
2703 |
|
2700 |
def _pop_disjunction(self, allow_unsatisfied): |
2704 |
def _pop_disjunction(self, allow_unsatisfied): |
2701 |
""" |
2705 |
""" |
2702 |
Pop one disjunctive dep from self._dynamic_config._dep_disjunctive_stack, and use it to |
2706 |
Pop one disjunctive dep from self._dynamic_config._dep_disjunctive_stack, and use it to |
2703 |
populate self._dynamic_config._dep_stack. |
2707 |
populate self._dynamic_config._dep_stack. |
2704 |
""" |
2708 |
""" |
2705 |
pkg, dep_root, dep_priority, dep_struct = \ |
2709 |
pkg, dep_root, dep_priority, dep_struct, dep_type = \ |
2706 |
self._dynamic_config._dep_disjunctive_stack.pop() |
2710 |
self._dynamic_config._dep_disjunctive_stack.pop() |
2707 |
if not self._add_pkg_dep_string( |
2711 |
if not self._add_pkg_dep_string( |
2708 |
pkg, dep_root, dep_priority, dep_struct, allow_unsatisfied): |
2712 |
pkg, dep_root, dep_priority, dep_struct, allow_unsatisfied, dep_type): |
2709 |
return 0 |
2713 |
return 0 |
2710 |
return 1 |
2714 |
return 1 |
2711 |
|
2715 |
|
Lines 3513-3519
Link Here
|
3513 |
**portage._native_kwargs(kwargs)) |
3517 |
**portage._native_kwargs(kwargs)) |
3514 |
|
3518 |
|
3515 |
def _select_atoms_highest_available(self, root, depstring, |
3519 |
def _select_atoms_highest_available(self, root, depstring, |
3516 |
myuse=None, parent=None, strict=True, trees=None, priority=None): |
3520 |
myuse=None, parent=None, strict=True, trees=None, priority=None, dep_type=None): |
3517 |
"""This will raise InvalidDependString if necessary. If trees is |
3521 |
"""This will raise InvalidDependString if necessary. If trees is |
3518 |
None then self._dynamic_config._filtered_trees is used.""" |
3522 |
None then self._dynamic_config._filtered_trees is used.""" |
3519 |
|
3523 |
|
Lines 3536-3541
Link Here
|
3536 |
pkgsettings = self._frozen_config.pkgsettings[root] |
3540 |
pkgsettings = self._frozen_config.pkgsettings[root] |
3537 |
if trees is None: |
3541 |
if trees is None: |
3538 |
trees = self._dynamic_config._filtered_trees |
3542 |
trees = self._dynamic_config._filtered_trees |
|
|
3543 |
|
3544 |
# this one is needed to guarantee good readonly root |
3545 |
# resolution display in the merge list. required since |
3546 |
# parent (below) can be None |
3547 |
trees[root]["disp_parent"] = parent |
3548 |
|
3539 |
mytrees = trees[root] |
3549 |
mytrees = trees[root] |
3540 |
atom_graph = digraph() |
3550 |
atom_graph = digraph() |
3541 |
if True: |
3551 |
if True: |
Lines 3564-3570
Link Here
|
3564 |
|
3574 |
|
3565 |
mycheck = portage.dep_check(depstring, None, |
3575 |
mycheck = portage.dep_check(depstring, None, |
3566 |
pkgsettings, myuse=myuse, |
3576 |
pkgsettings, myuse=myuse, |
3567 |
myroot=root, trees=trees) |
3577 |
myroot=root, trees=trees, dep_type=dep_type) |
3568 |
finally: |
3578 |
finally: |
3569 |
# restore state |
3579 |
# restore state |
3570 |
self._dynamic_config._autounmask = _autounmask_backup |
3580 |
self._dynamic_config._autounmask = _autounmask_backup |
Lines 3631-3636
Link Here
|
3631 |
continue |
3641 |
continue |
3632 |
node_stack.append((child_node, node, child_atom)) |
3642 |
node_stack.append((child_node, node, child_atom)) |
3633 |
|
3643 |
|
|
|
3644 |
trees[root].pop("disp_parent") |
3634 |
return selected_atoms |
3645 |
return selected_atoms |
3635 |
|
3646 |
|
3636 |
def _expand_virt_from_graph(self, root, atom): |
3647 |
def _expand_virt_from_graph(self, root, atom): |
Lines 3906-3911
Link Here
|
3906 |
|
3917 |
|
3907 |
def _show_unsatisfied_dep(self, root, atom, myparent=None, arg=None, |
3918 |
def _show_unsatisfied_dep(self, root, atom, myparent=None, arg=None, |
3908 |
check_backtrack=False, check_autounmask_breakage=False, show_req_use=None): |
3919 |
check_backtrack=False, check_autounmask_breakage=False, show_req_use=None): |
|
|
3920 |
# print readonly selected packages |
3921 |
if len(ro_selected) > 0: |
3922 |
out.write("\n%s\n\n" % (darkgreen("Packages resolved from readonly installations:"))) |
3923 |
|
3924 |
ro_mismatch_warning = False |
3925 |
ro_dupcheck = [] |
3926 |
for x in ro_selected: |
3927 |
tmp_type = x["type"].replace("END","") |
3928 |
while len(tmp_type) < 4: |
3929 |
tmp_type += " " |
3930 |
if str(x["atom"]) not in ro_dupcheck: |
3931 |
out.write("[%s %s] %s %s %s (%s by %s)" % (teal("readonly"), |
3932 |
green(tmp_type), green(str(x["matches"][0])), yellow("from"), |
3933 |
blue(x["ro_root"]), turquoise(str(x["atom"])), green(x["parent"].cpv))) |
3934 |
|
3935 |
ro_dupcheck.append(str(x["atom"])) |
3936 |
|
3937 |
if x["host_mismatch"]: |
3938 |
ro_mismatch_warning = True |
3939 |
out.write(" %s\n" % (red("**"))) |
3940 |
else: |
3941 |
out.write("\n") |
3942 |
|
3943 |
if ro_mismatch_warning: |
3944 |
out.write("\n%s:" % (red("**"))) |
3945 |
out.write(yellow(" WARNING: packages marked with ** have been resolved as a\n")) |
3946 |
out.write(yellow(" runtime dependency, but the CHOST variable for the parent\n")) |
3947 |
out.write(yellow(" and dependency package don't match. This could cause link\n")) |
3948 |
out.write(yellow(" errors. It is recommended to use RDEPEND READONLY_EPREFIX's\n")) |
3949 |
out.write(yellow(" only with matching CHOST portage instances.\n")) |
3950 |
|
3909 |
""" |
3951 |
""" |
3910 |
When check_backtrack=True, no output is produced and |
3952 |
When check_backtrack=True, no output is produced and |
3911 |
the method either returns or raises _backtrack_mask if |
3953 |
the method either returns or raises _backtrack_mask if |