| # -*- coding:utf-8 -*- |
| |
| from portage import normalize_path |
| from portage import os |
| from portage.output import red |
| |
| |
| class ProfileDesc: |
| __slots__ = ( |
| "abs_path", |
| "arch", |
| "status", |
| "sub_path", |
| "tree_path", |
| ) |
| |
| def __init__(self, arch, status, sub_path, tree_path): |
| self.arch = arch |
| self.status = status |
| if sub_path: |
| sub_path = normalize_path(sub_path.lstrip(os.sep)) |
| self.sub_path = sub_path |
| self.tree_path = tree_path |
| if tree_path: |
| self.abs_path = os.path.join(tree_path, "profiles", self.sub_path) |
| else: |
| self.abs_path = tree_path |
| |
| def __str__(self): |
| if self.sub_path: |
| return self.sub_path |
| return "empty profile" |
| |
| |
| valid_profile_types = frozenset(["dev", "exp", "stable"]) |
| |
| |
| def dev_profile_keywords(profiles): |
| """ |
| Create a set of KEYWORDS values that exist in 'dev' |
| profiles. These are used |
| to trigger a message notifying the user when they might |
| want to add the --include-dev option. |
| """ |
| type_arch_map = {} |
| for arch, arch_profiles in profiles.items(): |
| for prof in arch_profiles: |
| arch_set = type_arch_map.get(prof.status) |
| if arch_set is None: |
| arch_set = set() |
| type_arch_map[prof.status] = arch_set |
| arch_set.add(arch) |
| |
| dev_keywords = type_arch_map.get("dev", set()) |
| dev_keywords.update(["~" + arch for arch in dev_keywords]) |
| return frozenset(dev_keywords) |
| |
| |
| def setup_profile(profile_list): |
| # Ensure that profile sub_path attributes are unique. Process in reverse order |
| # so that profiles with duplicate sub_path from overlays will override |
| # profiles with the same sub_path from parent repos. |
| profiles = {} |
| profile_list.reverse() |
| profile_sub_paths = set() |
| for prof in profile_list: |
| if prof.sub_path in profile_sub_paths: |
| continue |
| profile_sub_paths.add(prof.sub_path) |
| profiles.setdefault(prof.arch, []).append(prof) |
| |
| # Use an empty profile for checking dependencies of |
| # packages that have empty KEYWORDS. |
| prof = ProfileDesc("**", "stable", "", "") |
| profiles.setdefault(prof.arch, []).append(prof) |
| return profiles |
| |
| |
| def check_profiles(profiles, archlist): |
| for x in archlist: |
| if x[0] == "~": |
| continue |
| if x not in profiles: |
| print( |
| red('"%s" doesn\'t have a valid profile listed in profiles.desc.' % x) |
| ) |
| print( |
| red( |
| 'You need to either "cvs update" your profiles dir' |
| " or follow this" |
| ) |
| ) |
| print(red("up with the " + x + " team.")) |
| print() |