summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-01-10 08:40:35 +0000
committerZac Medico <zmedico@gentoo.org>2009-01-10 08:40:35 +0000
commitb6a0989c5983cebdb644a5f62446c508c2689eeb (patch)
tree7614b7a984aeb8d7ff1eb68d8a45b2461e8c6886 /pym
parent143a289e23162d8331598aab8e22e6011b0274a2 (diff)
downloadportage-b6a0989c5983cebdb644a5f62446c508c2689eeb.tar.gz
portage-b6a0989c5983cebdb644a5f62446c508c2689eeb.tar.bz2
portage-b6a0989c5983cebdb644a5f62446c508c2689eeb.zip
Bug #55321 - Add support for package.keywords in profiles. In profiles,
package.keywords modifies effective KEYWORDS values for a given ebuild. This behavior is notably different from /etc/portage/package.keywords, which instead modifies effective ACCEPT_KEYWORDS. svn path=/main/trunk/; revision=12410
Diffstat (limited to 'pym')
-rw-r--r--pym/portage/__init__.py35
1 files changed, 32 insertions, 3 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index bd5425d46..ff577af00 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -1132,6 +1132,7 @@ class config(object):
self.pusedict = copy.deepcopy(clone.pusedict)
self.categories = copy.deepcopy(clone.categories)
self.pkeywordsdict = copy.deepcopy(clone.pkeywordsdict)
+ self._pkeywords_list = copy.deepcopy(clone._pkeywords_list)
self.pmaskdict = copy.deepcopy(clone.pmaskdict)
self.punmaskdict = copy.deepcopy(clone.punmaskdict)
self.prevmaskdict = copy.deepcopy(clone.prevmaskdict)
@@ -1261,6 +1262,16 @@ class config(object):
else:
self.prevmaskdict[mycatpkg].append(x)
+ self._pkeywords_list = []
+ rawpkeywords = [grabdict_package(
+ os.path.join(x, "package.keywords")) \
+ for x in self.profiles]
+ for i in xrange(len(self.profiles)):
+ cpdict = {}
+ for k, v in rawpkeywords[i].iteritems():
+ cpdict.setdefault(dep_getkey(k), {})[k] = v
+ self._pkeywords_list.append(cpdict)
+
# get profile-masked use flags -- INCREMENTAL Child over parent
self.usemask_list = [grabfile(os.path.join(x, "use.mask")) \
for x in self.profiles]
@@ -2240,6 +2251,25 @@ class config(object):
return x
return None
+ def _getKeywords(self, cpv, metadata):
+ cp = dep_getkey(cpv)
+ pkg = "%s:%s" % (cpv, metadata["SLOT"])
+ keywords = metadata["KEYWORDS"].split()
+ pos = len(keywords)
+ for i in xrange(len(self.profiles)):
+ cpdict = self._pkeywords_list[i].get(cp, None)
+ if cpdict:
+ keys = list(cpdict)
+ while keys:
+ best_match = best_match_to_list(pkg, keys)
+ if best_match:
+ keys.remove(best_match)
+ keywords.insert(pos, cpdict[best_match])
+ else:
+ break
+ pos = len(keywords)
+ return stack_lists(keywords, incremental=True)
+
def _getMissingKeywords(self, cpv, metadata):
"""
Take a package and return a list of any KEYWORDS that the user may
@@ -2261,7 +2291,7 @@ class config(object):
# object (bug #139600)
egroups = self.configdict["backupenv"].get(
"ACCEPT_KEYWORDS", "").split()
- mygroups = metadata["KEYWORDS"].split()
+ mygroups = self._getKeywords(cpv, metadata)
# Repoman may modify this attribute as necessary.
pgroups = self["ACCEPT_KEYWORDS"].split()
match=0
@@ -6963,7 +6993,7 @@ def getmaskingstatus(mycpv, settings=None, portdb=None):
# keywords checking
eapi = metadata["EAPI"]
- mygroups = metadata["KEYWORDS"]
+ mygroups = settings._getKeywords(mycpv, metadata)
licenses = metadata["LICENSE"]
slot = metadata["SLOT"]
if eapi.startswith("-"):
@@ -6974,7 +7004,6 @@ def getmaskingstatus(mycpv, settings=None, portdb=None):
return ["EAPI %s" % eapi]
egroups = settings.configdict["backupenv"].get(
"ACCEPT_KEYWORDS", "").split()
- mygroups = mygroups.split()
pgroups = settings["ACCEPT_KEYWORDS"].split()
myarch = settings["ARCH"]
if pgroups and myarch not in pgroups: