public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
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()



             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