diff options
Diffstat (limited to 'pym/portage/package/ebuild/config.py')
-rw-r--r-- | pym/portage/package/ebuild/config.py | 158 |
1 files changed, 109 insertions, 49 deletions
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py index 2ffad468..4f5f9413 100644 --- a/pym/portage/package/ebuild/config.py +++ b/pym/portage/package/ebuild/config.py @@ -843,12 +843,8 @@ class config(object): else: self.configdict["conf"]["ACCEPT_LICENSE"] = " ".join(v) for k, v in licdict.items(): - cp = k.cp - cp_dict = self._plicensedict.get(cp) - if not cp_dict: - cp_dict = {} - self._plicensedict[cp] = cp_dict - cp_dict[k] = self.expandLicenseTokens(v) + self._plicensedict.setdefault(k.cp, {})[k] = \ + self.expandLicenseTokens(v) #package.properties propdict = grabdict_package(os.path.join( @@ -860,12 +856,7 @@ class config(object): else: self.configdict["conf"]["ACCEPT_PROPERTIES"] = " ".join(v) for k, v in propdict.items(): - cp = k.cp - cp_dict = self._ppropertiesdict.get(cp) - if not cp_dict: - cp_dict = {} - self._ppropertiesdict[cp] = cp_dict - cp_dict[k] = v + self._ppropertiesdict.setdefault(k.cp, {})[k] = v #getting categories from an external file now categories = [grabfile(os.path.join(x, "categories")) for x in locations] @@ -1425,22 +1416,24 @@ class config(object): has_changed = True defaults = [] - pos = 0 for i, pkgprofileuse_dict in enumerate(self.pkgprofileuse): + if self.make_defaults_use[i]: + defaults.append(self.make_defaults_use[i]) cpdict = pkgprofileuse_dict.get(cp) if cpdict: + pkg_defaults = [] keys = list(cpdict) while keys: bestmatch = best_match_to_list(cpv_slot, keys) if bestmatch: keys.remove(bestmatch) - defaults.insert(pos, cpdict[bestmatch]) + pkg_defaults.append(cpdict[bestmatch]) else: break - del keys - if self.make_defaults_use[i]: - defaults.insert(pos, self.make_defaults_use[i]) - pos = len(defaults) + if pkg_defaults: + # reverse, so the most specific atoms come last + pkg_defaults.reverse() + defaults.extend(pkg_defaults) defaults = " ".join(defaults) if defaults != self.configdict["defaults"].get("USE",""): self.configdict["defaults"]["USE"] = defaults @@ -1614,22 +1607,24 @@ class config(object): if cp is None: cp = cpv_getkey(remove_slot(pkg)) usemask = [] - pos = 0 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 = [] keys = list(cpdict) while keys: best_match = best_match_to_list(pkg, keys) if best_match: keys.remove(best_match) - usemask.insert(pos, cpdict[best_match]) + pkg_usemask.append(cpdict[best_match]) else: break - del keys - if self.usemask_list[i]: - usemask.insert(pos, self.usemask_list[i]) - pos = len(usemask) + if pkg_usemask: + # reverse, so the most specific atoms come last + pkg_usemask.reverse() + usemask.extend(pkg_usemask) return set(stack_lists(usemask, incremental=True)) def _getUseForce(self, pkg): @@ -1637,22 +1632,24 @@ class config(object): if cp is None: cp = cpv_getkey(remove_slot(pkg)) useforce = [] - pos = 0 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 = [] keys = list(cpdict) while keys: best_match = best_match_to_list(pkg, keys) if best_match: keys.remove(best_match) - useforce.insert(pos, cpdict[best_match]) + pkg_useforce.append(cpdict[best_match]) else: break - del keys - if self.useforce_list[i]: - useforce.insert(pos, self.useforce_list[i]) - pos = len(useforce) + if pkg_useforce: + # reverse, so the most specific atoms come last + pkg_useforce.reverse() + useforce.extend(pkg_useforce) return set(stack_lists(useforce, incremental=True)) def _getMaskAtom(self, cpv, metadata): @@ -1721,19 +1718,22 @@ class config(object): if 'repository' in metadata: pkg = "".join((pkg, _repo_separator, metadata['repository'])) keywords = [[x for x in metadata["KEYWORDS"].split() if x != "-*"]] - pos = len(keywords) for pkeywords_dict in self._pkeywords_list: cpdict = pkeywords_dict.get(cp) if cpdict: + pkg_keywords = [] 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]) + pkg_keywords.append(cpdict[best_match]) else: break - pos = len(keywords) + if pkg_keywords: + # reverse, so the most specific atoms come last + pkg_keywords.reverse() + keywords.extend(pkg_keywords) return stack_lists(keywords, incremental=True) def _getMissingKeywords(self, cpv, metadata): @@ -1765,14 +1765,24 @@ class config(object): pkgdict = self.pkeywordsdict.get(cp) matches = False if pkgdict: - pkg = "".join((cpv, _slot_separator, metadata["SLOT"])) + cpv_slot = "%s:%s" % (cpv, metadata["SLOT"]) if 'repository' in metadata: - pkg = "".join((pkg, _repo_separator, metadata['repository'])) - cpv_slot_list = [pkg] - for atom, pkgkeywords in pkgdict.items(): - if match_from_list(atom, cpv_slot_list): - matches = True - pgroups.extend(pkgkeywords) + cpv_slot = "".join((cpv_slot, _repo_separator, metadata['repository'])) + pkg_accept_keywords = [] + keys = list(pkgdict) + while keys: + best_match = best_match_to_list(cpv_slot, keys) + if best_match: + keys.remove(best_match) + pkg_accept_keywords.append(pkgdict[best_match]) + else: + break + if pkg_accept_keywords: + # reverse, so the most specific atoms come last + pkg_accept_keywords.reverse() + for x in pkg_accept_keywords: + pgroups.extend(x) + matches = True if matches or egroups: pgroups.extend(egroups) inc_pgroups = set() @@ -1834,12 +1844,24 @@ class config(object): cp = cpv_getkey(cpv) cpdict = self._plicensedict.get(cp) if cpdict: - accept_license = list(self._accept_license) - cpv_slot = "".join((cpv, _slot_separator, metadata["SLOT"])) + cpv_slot = "%s:%s" % (cpv, metadata["SLOT"]) if 'repository' in metadata: cpv_slot = "".join((cpv_slot, _repo_separator, metadata['repository'])) - for atom in match_to_list(cpv_slot, list(cpdict)): - accept_license.extend(cpdict[atom]) + keys = list(cpdict) + plicence_list = [] + while keys: + bestmatch = best_match_to_list(cpv_slot, keys) + if bestmatch: + keys.remove(bestmatch) + plicence_list.append(cpdict[bestmatch]) + else: + break + if plicence_list: + # reverse, so the most specific atoms come last + plicence_list.reverse() + accept_license = list(self._accept_license) + for x in plicence_list: + accept_license.extend(x) licenses = set(flatten(use_reduce(paren_reduce( metadata["LICENSE"]), matchall=1))) @@ -1916,12 +1938,24 @@ class config(object): cp = cpv_getkey(cpv) cpdict = self._ppropertiesdict.get(cp) if cpdict: - accept_properties = list(self._accept_properties) - cpv_slot = "".join((cpv, _slot_separator, metadata["SLOT"])) + cpv_slot = "%s:%s" % (cpv, metadata["SLOT"]) if 'repository' in metadata: cpv_slot = "".join((cpv_slot, _repo_separator, metadata['repository'])) - for atom in match_to_list(cpv_slot, list(cpdict)): - accept_properties.extend(cpdict[atom]) + keys = list(cpdict) + pproperties_list = [] + while keys: + bestmatch = best_match_to_list(cpv_slot, keys) + if bestmatch: + keys.remove(bestmatch) + pproperties_list.append(cpdict[bestmatch]) + else: + break + if pproperties_list: + # reverse, so the most specific atoms come last + pproperties_list.reverse() + accept_properties = list(self._accept_properties) + for x in pproperties_list: + accept_properties.extend(x) properties = set(flatten(use_reduce(paren_reduce( metadata["PROPERTIES"]), matchall=1))) @@ -2228,6 +2262,9 @@ class config(object): # For optimal performance, use slice # comparison instead of startswith(). + iuse = self.configdict["pkg"].get("IUSE") + if iuse is not None: + iuse = [x.lstrip("+-") for x in iuse.split()] myflags = set() for curdb in self.uvlist: cur_use_expand = [x for x in use_expand if x in curdb] @@ -2247,10 +2284,33 @@ class config(object): continue if x[0] == "-": + if x[-2:] == '_*': + prefix = x[1:-1] + prefix_len = len(prefix) + myflags.difference_update( + [y for y in myflags if \ + y[:prefix_len] == prefix]) myflags.discard(x[1:]) continue - myflags.add(x) + if iuse is not None and x[-2:] == '_*': + # Expand wildcards here, so that cases like + # USE="linguas_* -linguas_en_US" work correctly. + prefix = x[:-1] + prefix_len = len(prefix) + has_iuse = False + for y in iuse: + if y[:prefix_len] == prefix: + has_iuse = True + myflags.add(y) + if not has_iuse: + # There are no matching IUSE, so allow the + # wildcard to pass through. This allows + # linguas_* to trigger unset LINGUAS in + # cases when no linguas_ flags are in IUSE. + myflags.add(x) + else: + myflags.add(x) for var in cur_use_expand: var_lower = var.lower() |