| # Copyright 2012-2013 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| from __future__ import unicode_literals |
| |
| from portage.dep import Atom, paren_enclose, use_reduce |
| from portage.eapi import _get_eapi_attrs |
| from portage.exception import InvalidData |
| from _emerge.Package import Package |
| |
| def find_built_slot_operator_atoms(pkg): |
| atoms = {} |
| for k in Package._dep_keys: |
| atom_list = list(_find_built_slot_operator(use_reduce(pkg._metadata[k], |
| uselist=pkg.use.enabled, eapi=pkg.eapi, |
| token_class=Atom))) |
| if atom_list: |
| atoms[k] = atom_list |
| return atoms |
| |
| def _find_built_slot_operator(dep_struct): |
| for x in dep_struct: |
| if isinstance(x, list): |
| for atom in _find_built_slot_operator(x): |
| yield atom |
| elif isinstance(x, Atom) and x.slot_operator_built: |
| yield x |
| |
| def ignore_built_slot_operator_deps(dep_struct): |
| for i, x in enumerate(dep_struct): |
| if isinstance(x, list): |
| ignore_built_slot_operator_deps(x) |
| elif isinstance(x, Atom) and x.slot_operator_built: |
| # There's no way of knowing here whether the SLOT |
| # part of the slot/sub-slot pair should be kept, so we |
| # ignore both parts. |
| dep_struct[i] = x.without_slot |
| |
| def evaluate_slot_operator_equal_deps(settings, use, trees): |
| |
| metadata = settings.configdict['pkg'] |
| eapi = metadata['EAPI'] |
| eapi_attrs = _get_eapi_attrs(eapi) |
| running_vardb = trees[trees._running_eroot]["vartree"].dbapi |
| target_vardb = trees[trees._target_eroot]["vartree"].dbapi |
| vardbs = [target_vardb] |
| deps = {} |
| for k in Package._dep_keys: |
| deps[k] = use_reduce(metadata[k], |
| uselist=use, eapi=eapi, token_class=Atom) |
| |
| for k in Package._runtime_keys: |
| _eval_deps(deps[k], vardbs) |
| |
| if eapi_attrs.hdepend: |
| _eval_deps(deps["HDEPEND"], [running_vardb]) |
| _eval_deps(deps["DEPEND"], [target_vardb]) |
| else: |
| if running_vardb is not target_vardb: |
| vardbs.append(running_vardb) |
| _eval_deps(deps["DEPEND"], vardbs) |
| |
| result = {} |
| for k, v in deps.items(): |
| result[k] = paren_enclose(v) |
| |
| return result |
| |
| def _eval_deps(dep_struct, vardbs): |
| for i, x in enumerate(dep_struct): |
| if isinstance(x, list): |
| _eval_deps(x, vardbs) |
| elif isinstance(x, Atom) and x.slot_operator == "=": |
| for vardb in vardbs: |
| best_version = vardb.match(x) |
| if best_version: |
| best_version = best_version[-1] |
| try: |
| best_version = \ |
| vardb._pkg_str(best_version, None) |
| except (KeyError, InvalidData): |
| pass |
| else: |
| slot_part = "%s/%s=" % \ |
| (best_version.slot, best_version.sub_slot) |
| x = x.with_slot(slot_part) |
| dep_struct[i] = x |
| break |
| else: |
| # this dep could not be resolved, so remove the operator |
| # (user may be using package.provided and managing rebuilds |
| # manually) |
| if x.slot: |
| x = x.with_slot(x.slot) |
| else: |
| x = x.without_slot |
| dep_struct[i] = x |