From: "Arfrever Frehtes Taifersar Arahesis" <arfrever@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
Date: Sun, 19 Jun 2011 16:40:41 +0000 (UTC) [thread overview]
Message-ID: <96ab7b436ceb3543f5158aab1fab48470c3f0b98.arfrever@gentoo> (raw)
commit: 96ab7b436ceb3543f5158aab1fab48470c3f0b98
Author: Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Gentoo <DOT> Org>
AuthorDate: Sun Jun 19 16:37:56 2011 +0000
Commit: Arfrever Frehtes Taifersar Arahesis <arfrever <AT> gentoo <DOT> org>
CommitDate: Sun Jun 19 16:37:56 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=96ab7b43
Bug #370693: Support use.force, package.use.force, use.mask and
package.use.mask files in ${repository}/profiles.
---
pym/portage/package/ebuild/_config/UseManager.py | 156 ++++++++++++++--------
pym/portage/package/ebuild/config.py | 2 +-
2 files changed, 100 insertions(+), 58 deletions(-)
diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py
index ae87b2f..d9ca940 100644
--- a/pym/portage/package/ebuild/_config/UseManager.py
+++ b/pym/portage/package/ebuild/_config/UseManager.py
@@ -1,10 +1,11 @@
-# Copyright 2010 Gentoo Foundation
+# Copyright 2010-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
__all__ = (
'UseManager',
)
+from _emerge.Package import Package
from portage import os
from portage.dep import ExtendedAtomDict, remove_slot, _get_useflag_re
from portage.localization import _
@@ -15,9 +16,16 @@ from portage.package.ebuild._config.helper import ordered_by_atom_specificity
class UseManager(object):
- def __init__(self, profiles, abs_user_config, user_config=True):
+ def __init__(self, repositories, profiles, abs_user_config, user_config=True):
# file variable
#--------------------------------
+ # repositories
+ #--------------------------------
+ # use.mask _repo_usemask_dict
+ # use.force _repo_useforce_dict
+ # package.use.mask _repo_pusemask_dict
+ # package.use.force _repo_puseforce_dict
+ #--------------------------------
# profiles
#--------------------------------
# use.mask _usemask_list
@@ -41,13 +49,62 @@ class UseManager(object):
#--------------------------------
# puse
- self._usemask_list = self._parse_profile_files_to_tuple("use.mask", profiles)
- self._useforce_list = self._parse_profile_files_to_tuple("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._repo_usemask_dict = self._parse_repository_files_to_dict_of_tuples("use.mask", repositories)
+ self._repo_useforce_dict = self._parse_repository_files_to_dict_of_tuples("use.force", repositories)
+ self._repo_pusemask_dict = self._parse_repository_files_to_dict_of_dicts("package.use.mask", repositories)
+ self._repo_puseforce_dict = self._parse_repository_files_to_dict_of_dicts("package.use.force", repositories)
+
+ self._usemask_list = self._parse_profile_files_to_tuple_of_tuples("use.mask", profiles)
+ self._useforce_list = self._parse_profile_files_to_tuple_of_tuples("use.force", profiles)
+ self._pusemask_list = self._parse_profile_files_to_tuple_of_dicts("package.use.mask", profiles)
+ self._pkgprofileuse = self._parse_profile_files_to_tuple_of_dicts("package.use", profiles, juststrings=True)
+ self._puseforce_list = self._parse_profile_files_to_tuple_of_dicts("package.use.force", profiles)
self._pusedict = self._parse_user_files_to_extatomdict("package.use", abs_user_config, user_config)
+
+ def _parse_file_to_tuple(self, file_name):
+ ret = []
+ lines = grabfile(file_name, recursive=1)
+ eapi = read_corresponding_eapi_file(file_name)
+ useflag_re = _get_useflag_re(eapi)
+ for prefixed_useflag in lines:
+ if prefixed_useflag[:1] == "-":
+ useflag = prefixed_useflag[1:]
+ else:
+ useflag = prefixed_useflag
+ if useflag_re.match(useflag) is None:
+ writemsg(_("--- Invalid USE flag in '%s': '%s'\n") %
+ (file_name, prefixed_useflag), noiselevel=-1)
+ else:
+ ret.append(prefixed_useflag)
+ return tuple(ret)
+
+ def _parse_file_to_dict(self, file_name, juststrings=False):
+ ret = {}
+ location_dict = {}
+ file_dict = grabdict_package(file_name, recursive=1, verify_eapi=True)
+ eapi = read_corresponding_eapi_file(file_name)
+ useflag_re = _get_useflag_re(eapi)
+ for k, v in file_dict.items():
+ useflags = []
+ for prefixed_useflag in v:
+ if prefixed_useflag[:1] == "-":
+ useflag = prefixed_useflag[1:]
+ else:
+ useflag = prefixed_useflag
+ if useflag_re.match(useflag) is None:
+ writemsg(_("--- Invalid USE flag for '%s' in '%s': '%s'\n") %
+ (k, file_name, prefixed_useflag), noiselevel=-1)
+ else:
+ useflags.append(prefixed_useflag)
+ location_dict.setdefault(k, []).extend(useflags)
+ for k, v in location_dict.items():
+ if juststrings:
+ v = " ".join(v)
+ else:
+ v = tuple(v)
+ ret.setdefault(k.cp, {})[k] = v
+ return ret
def _parse_user_files_to_extatomdict(self, file_name, location, user_config):
ret = ExtendedAtomDict(dict)
@@ -59,57 +116,28 @@ class UseManager(object):
return ret
- def _parse_profile_files_to_tuple(self, file_name, locations):
- ret = []
- for profile in locations:
- profile_lines = []
- path = os.path.join(profile, file_name)
- lines = grabfile(path, recursive=1)
- eapi = read_corresponding_eapi_file(path)
- useflag_re = _get_useflag_re(eapi)
- for prefixed_useflag in lines:
- if prefixed_useflag[:1] == "-":
- useflag = prefixed_useflag[1:]
- else:
- useflag = prefixed_useflag
- if useflag_re.match(useflag) is None:
- writemsg(_("--- Invalid USE flag in '%s': '%s'\n") % \
- (path, prefixed_useflag), noiselevel=-1)
- else:
- profile_lines.append(prefixed_useflag)
- ret.append(tuple(profile_lines))
- return tuple(ret)
+ def _parse_repository_files_to_dict_of_tuples(self, file_name, repositories):
+ ret = {}
+ for repo in repositories.repos_with_profiles():
+ lines = []
+ for master in repo.masters:
+ lines.extend(self._parse_file_to_tuple(os.path.join(master.location, "profiles", file_name)))
+ lines.extend(self._parse_file_to_tuple(os.path.join(repo.location, "profiles", file_name)))
+ ret[repo.name] = tuple(lines)
+ return ret
- def _parse_profile_files_to_dict(self, file_name, locations, juststrings=False):
- ret = []
- for profile in locations:
- profile_dict = {}
- cpdict = {}
- path = os.path.join(profile, file_name)
- file_dict = grabdict_package(path, recursive=1, verify_eapi=True)
- eapi = read_corresponding_eapi_file(path)
- useflag_re = _get_useflag_re(eapi)
- for k, v in file_dict.items():
- useflags = []
- for prefixed_useflag in v:
- if prefixed_useflag[:1] == "-":
- useflag = prefixed_useflag[1:]
- else:
- useflag = prefixed_useflag
- if useflag_re.match(useflag) is None:
- writemsg(_("--- Invalid USE flag for '%s' in '%s': '%s'\n") % \
- (k, path, prefixed_useflag), noiselevel=-1)
- else:
- useflags.append(prefixed_useflag)
- profile_dict.setdefault(k, []).extend(useflags)
- for k, v in profile_dict.items():
- if juststrings:
- v = " ".join(v)
- else:
- v = tuple(v)
- cpdict.setdefault(k.cp, {})[k] = v
- ret.append(cpdict)
- return tuple(ret)
+ def _parse_repository_files_to_dict_of_dicts(self, file_name, repositories):
+ ret = {}
+ for repo in repositories.repos_with_profiles():
+ # TODO: Handle master repositories.
+ ret[repo.name] = self._parse_file_to_dict(os.path.join(repo.location, "profiles", file_name))
+ return ret
+
+ def _parse_profile_files_to_tuple_of_tuples(self, file_name, locations):
+ return tuple(self._parse_file_to_tuple(os.path.join(profile, file_name)) for profile in locations)
+
+ def _parse_profile_files_to_tuple_of_dicts(self, file_name, locations, juststrings=False):
+ return tuple(self._parse_file_to_dict(os.path.join(profile, file_name), juststrings) for profile in locations)
def getUseMask(self, pkg=None):
if pkg is None:
@@ -120,6 +148,13 @@ class UseManager(object):
if cp is None:
cp = cpv_getkey(remove_slot(pkg))
usemask = []
+ if hasattr(pkg, "repo") and pkg.repo != Package.UNKNOWN_REPO:
+ usemask.append(self._repo_usemask_dict[pkg.repo])
+ cpdict = self._repo_pusemask_dict[pkg.repo].get(cp)
+ if cpdict:
+ pkg_usemask = ordered_by_atom_specificity(cpdict, pkg)
+ if pkg_usemask:
+ usemask.extend(pkg_usemask)
for i, pusemask_dict in enumerate(self._pusemask_list):
if self._usemask_list[i]:
usemask.append(self._usemask_list[i])
@@ -139,6 +174,13 @@ class UseManager(object):
if cp is None:
cp = cpv_getkey(remove_slot(pkg))
useforce = []
+ if hasattr(pkg, "repo") and pkg.repo != Package.UNKNOWN_REPO:
+ useforce.append(self._repo_useforce_dict[pkg.repo])
+ cpdict = self._repo_puseforce_dict[pkg.repo].get(cp)
+ if cpdict:
+ pkg_useforce = ordered_by_atom_specificity(cpdict, pkg)
+ if pkg_useforce:
+ useforce.extend(pkg_useforce)
for i, puseforce_dict in enumerate(self._puseforce_list):
if self._useforce_list[i]:
useforce.append(self._useforce_list[i])
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index b45f3c1..466b701 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -513,7 +513,7 @@ class config(object):
local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
#Read all USE related files from profiles and optionally from user config.
- self._use_manager = UseManager(self.profiles, abs_user_config, user_config=local_config)
+ self._use_manager = UseManager(self.repositories, self.profiles, abs_user_config, user_config=local_config)
#Initialize all USE related variables we track ourselves.
self.usemask = self._use_manager.getUseMask()
self.useforce = self._use_manager.getUseForce()
next reply other threads:[~2011-06-19 16:40 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-19 16:40 Arfrever Frehtes Taifersar Arahesis [this message]
-- strict thread matches above, loose matches on Subject: below --
2011-06-21 3:27 [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/ Zac Medico
2011-06-27 0:34 Zac Medico
2011-10-25 21:44 Zac Medico
2011-10-25 21:44 Zac Medico
2011-10-27 18:32 Zac Medico
2011-10-27 20:49 Zac Medico
2013-01-24 21:53 Zac Medico
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=96ab7b436ceb3543f5158aab1fab48470c3f0b98.arfrever@gentoo \
--to=arfrever@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox