summaryrefslogtreecommitdiffstats
path: root/pym/portage/package/ebuild/_config/UseManager.py
diff options
context:
space:
mode:
authorSebastian Luther <SebastianLuther@gmx.de>2010-08-25 10:46:03 +0200
committerZac Medico <zmedico@gentoo.org>2010-08-25 01:56:28 -0700
commite10933cbc64fe631699805194b23f258656ed2f0 (patch)
tree4c2056a8959d6fbcd33c823b34fa2353510020e8 /pym/portage/package/ebuild/_config/UseManager.py
parent21e21efea3e486d994887ecfe3bb210c91bdd74e (diff)
downloadportage-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.py142
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