diff options
author | Sebastian Luther <SebastianLuther@gmx.de> | 2010-08-25 10:46:03 +0200 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-08-25 01:56:28 -0700 |
commit | e10933cbc64fe631699805194b23f258656ed2f0 (patch) | |
tree | 4c2056a8959d6fbcd33c823b34fa2353510020e8 /pym/portage/package/ebuild/_config/UseManager.py | |
parent | 21e21efea3e486d994887ecfe3bb210c91bdd74e (diff) | |
download | portage-e10933cbc64fe631699805194b23f258656ed2f0.tar.gz portage-e10933cbc64fe631699805194b23f258656ed2f0.tar.bz2 portage-e10933cbc64fe631699805194b23f258656ed2f0.zip |
config: Move handling of USE related config files into UseManager
Diffstat (limited to 'pym/portage/package/ebuild/_config/UseManager.py')
-rw-r--r-- | pym/portage/package/ebuild/_config/UseManager.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py new file mode 100644 index 000000000..b33e10a9d --- /dev/null +++ b/pym/portage/package/ebuild/_config/UseManager.py @@ -0,0 +1,142 @@ +# Copyright 2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +__all__ = ( + 'UseManager', +) + +from portage import os +from portage.dep import ExtendedAtomDict, remove_slot +from portage.util import grabfile, grabdict_package, stack_lists +from portage.versions import cpv_getkey + +from portage.package.ebuild._config.helper import ordered_by_atom_specificity + +class UseManager(object): + + def __init__(self, profiles, abs_user_config, user_config=True): + # file variable + #-------------------------------- + # profiles + #-------------------------------- + # use.mask _usemask_list + # use.force _useforce_list + # package.use.mask _pusemask_list + # package.use _pkgprofileuse + # package.use.force _puseforce_list + #-------------------------------- + # user config + #-------------------------------- + # package.use _pusedict + + # Dynamic variables tracked by the config class + #-------------------------------- + # profiles + #-------------------------------- + # usemask + # useforce + #-------------------------------- + # user config + #-------------------------------- + # puse + + self._usemask_list = self._parse_profile_files_to_list("use.mask", profiles) + self._useforce_list = self._parse_profile_files_to_list("use.force", profiles) + self._pusemask_list = self._parse_profile_files_to_dict("package.use.mask", profiles) + self._pkgprofileuse = self._parse_profile_files_to_dict("package.use", profiles, juststrings=True) + self._puseforce_list = self._parse_profile_files_to_dict("package.use.force", profiles) + + self._pusedict = self._parse_user_files_to_extatomdict("package.use", abs_user_config, user_config) + + def _parse_user_files_to_extatomdict(self, file_name, location, user_config): + ret = ExtendedAtomDict(dict) + if user_config: + pusedict = grabdict_package( + os.path.join(location, file_name), recursive=1, allow_wildcard=True) + for k, v in pusedict.items(): + ret.setdefault(k.cp, {})[k] = v + + return ret + + def _parse_profile_files_to_list(self, file_name, locations): + return tuple( + tuple(grabfile(os.path.join(x, file_name), recursive=1)) + for x in locations) + + def _parse_profile_files_to_dict(self, file_name, locations, juststrings=False): + ret = [] + raw = [grabdict_package(os.path.join(x, file_name), + juststrings=juststrings, recursive=1) for x in locations] + for rawdict in raw: + cpdict = {} + for k, v in rawdict.items(): + cpdict.setdefault(k.cp, {})[k] = v + ret.append(cpdict) + return ret + + def getUseMask(self, pkg=None): + if pkg is None: + return set(stack_lists( + self._usemask_list, incremental=True)) + + cp = getattr(pkg, "cp", None) + if cp is None: + cp = cpv_getkey(remove_slot(pkg)) + usemask = [] + for i, pusemask_dict in enumerate(self._pusemask_list): + if self._usemask_list[i]: + usemask.append(self._usemask_list[i]) + cpdict = pusemask_dict.get(cp) + if cpdict: + pkg_usemask = ordered_by_atom_specificity(cpdict, pkg) + if pkg_usemask: + usemask.extend(pkg_usemask) + return set(stack_lists(usemask, incremental=True)) + + def getUseForce(self, pkg=None): + if pkg is None: + return set(stack_lists( + self._useforce_list, incremental=True)) + + cp = getattr(pkg, "cp", None) + if cp is None: + cp = cpv_getkey(remove_slot(pkg)) + useforce = [] + for i, puseforce_dict in enumerate(self._puseforce_list): + if self._useforce_list[i]: + useforce.append(self._useforce_list[i]) + cpdict = puseforce_dict.get(cp) + if cpdict: + pkg_useforce = ordered_by_atom_specificity(cpdict, pkg) + if pkg_useforce: + useforce.extend(pkg_useforce) + return set(stack_lists(useforce, incremental=True)) + + def getPUSE(self, pkg): + cp = getattr(pkg, "cp", None) + if cp is None: + cp = cpv_getkey(remove_slot(pkg)) + ret = "" + cpdict = self._pusedict.get(cp) + if cpdict: + puse_matches = ordered_by_atom_specificity(cpdict, pkg) + if puse_matches: + puse_list = [] + for x in puse_matches: + puse_list.extend(x) + ret = " ".join(puse_list) + return ret + + def extract_global_USE_changes(self, old=""): + ret = old + cpdict = self._pusedict.get("*/*") + if cpdict is not None: + v = cpdict.pop("*/*", None) + if v is not None: + ret = " ".join(v) + if old: + ret = old + " " + ret + if not cpdict: + #No tokens left in atom_license_map, remove it. + del self._pusedict["*/*"] + return ret |