blob: b317189effc94ae05e7a73af91e874398a698df2 [file] [log] [blame]
# -*- 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()