public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-06-19 16:40 Arfrever Frehtes Taifersar Arahesis
  0 siblings, 0 replies; 8+ messages in thread
From: Arfrever Frehtes Taifersar Arahesis @ 2011-06-19 16:40 UTC (permalink / raw
  To: gentoo-commits

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()



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-06-21  3:27 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-06-21  3:27 UTC (permalink / raw
  To: gentoo-commits

commit:     96ab3f8e703138bbbda0c50bb05998281207a4d4
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 21 03:27:38 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Jun 21 03:27:38 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=96ab3f8e

config: fix repo KeyErrors

---
 pym/portage/package/ebuild/_config/UseManager.py |   18 ++++++++++++++++--
 pym/portage/package/ebuild/config.py             |   10 ++++++++--
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py
index 67e9294..d7ef0f6 100644
--- a/pym/portage/package/ebuild/_config/UseManager.py
+++ b/pym/portage/package/ebuild/_config/UseManager.py
@@ -147,7 +147,14 @@ class UseManager(object):
 			cp = cpv_getkey(remove_slot(pkg))
 		usemask = []
 		if hasattr(pkg, "repo") and pkg.repo != Package.UNKNOWN_REPO:
-			for repo in [repo.name for repo in self.repositories[pkg.repo].masters] + [pkg.repo]:
+			repos = []
+			try:
+				repos.extend(repo.name for repo in
+					self.repositories[pkg.repo].masters)
+			except KeyError:
+				pass
+			repos.append(pkg.repo)
+			for repo in repos:
 				usemask.append(self._repo_usemask_dict.get(repo, {}))
 				cpdict = self._repo_pusemask_dict.get(repo, {}).get(cp)
 				if cpdict:
@@ -174,7 +181,14 @@ class UseManager(object):
 			cp = cpv_getkey(remove_slot(pkg))
 		useforce = []
 		if hasattr(pkg, "repo") and pkg.repo != Package.UNKNOWN_REPO:
-			for repo in [repo.name for repo in self.repositories[pkg.repo].masters] + [pkg.repo]:
+			repos = []
+			try:
+				repos.extend(repo.name for repo in
+					self.repositories[pkg.repo].masters)
+			except KeyError:
+				pass
+			repos.append(pkg.repo)
+			for repo in repos:
 				useforce.append(self._repo_useforce_dict.get(repo, {}))
 				cpdict = self._repo_puseforce_dict.get(repo, {}).get(cp)
 				if cpdict:

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 6b7af51..c8ea1c8 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -1127,8 +1127,14 @@ class config(object):
 		repo_env = []
 		repo_env_empty = True
 		if repository and repository != Package.UNKNOWN_REPO:
-			for repo in [repo.name for
-				repo in self.repositories[repository].masters] + [repository]:
+			repos = []
+			try:
+				repos.extend(repo.name for repo in
+					self.repositories[repository].masters)
+			except KeyError:
+				pass
+			repos.append(repository)
+			for repo in repos:
 				d = self._repo_make_defaults.get(repo)
 				if d is None:
 					d = {}



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-06-27  0:34 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-06-27  0:34 UTC (permalink / raw
  To: gentoo-commits

commit:     84f53ead91047d1389c80edeb7d9d1720e07e2a4
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 27 00:34:13 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Jun 27 00:34:13 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=84f53ead

config: disallow per-package/repo CONFIG_PROTECT

In order for reliable etc-update behavior, CONFIG_PROTECT needs to be
a global constant (see bug 370693, comment #8).

---
 .../package/ebuild/_config/special_env_vars.py     |    6 ++++++
 pym/portage/package/ebuild/config.py               |    4 ++++
 2 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/special_env_vars.py b/pym/portage/package/ebuild/_config/special_env_vars.py
index 0214c86..3da724d 100644
--- a/pym/portage/package/ebuild/_config/special_env_vars.py
+++ b/pym/portage/package/ebuild/_config/special_env_vars.py
@@ -165,6 +165,12 @@ environ_filter += [
 
 environ_filter = frozenset(environ_filter)
 
+# Variables that are not allowed to have per-repo or per-package
+# settings.
+global_only_vars = frozenset([
+	"CONFIG_PROTECT",
+])
+
 default_globals = {
 	'ACCEPT_LICENSE':           '* -@EULA',
 	'ACCEPT_PROPERTIES':        '*',

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index c8ea1c8..c467efe 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -130,6 +130,7 @@ class config(object):
 	_environ_filter = special_env_vars.environ_filter
 	_environ_whitelist = special_env_vars.environ_whitelist
 	_environ_whitelist_re = special_env_vars.environ_whitelist_re
+	_global_only_vars = special_env_vars.global_only_vars
 
 	def __init__(self, clone=None, mycpv=None, config_profile_path=None,
 		config_incrementals=None, config_root=None, target_root=None,
@@ -1142,6 +1143,8 @@ class config(object):
 					# make a copy, since we might modify it with
 					# package.use settings
 					d = d.copy()
+					for k in self._global_only_vars:
+						d.pop(k, None)
 				repo_env.append(d)
 				cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp)
 				if cpdict:
@@ -1206,6 +1209,7 @@ class config(object):
 
 		protected_pkg_keys = set(pkg_configdict)
 		protected_pkg_keys.discard('USE')
+		protected_pkg_keys.update(self._global_only_vars)
 
 		# If there are _any_ package.env settings for this package
 		# then it automatically triggers config.reset(), in order



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-10-25 21:44 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-10-25 21:44 UTC (permalink / raw
  To: gentoo-commits

commit:     e544ee13527a0568de2b556510280ed96fc1b3ff
Author:     Brian Harring <ferringb <AT> chromium <DOT> org>
AuthorDate: Tue Oct 25 05:41:17 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Oct 25 21:36:43 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e544ee13

add profile-formats portage-1 awareness and enforcement

Currently it just spits warnings for implicit portage-1 format usage;
down the line, this will be converted into an explicit error.

For repo's that configure themselves as portage-1 or pms explicitly, enforce
it.

---
 .../package/ebuild/_config/KeywordsManager.py      |    4 +-
 .../package/ebuild/_config/LocationsManager.py     |    4 +-
 pym/portage/package/ebuild/_config/MaskManager.py  |   34 ++++++---
 pym/portage/package/ebuild/_config/UseManager.py   |   14 ++--
 pym/portage/package/ebuild/config.py               |   76 +++++++++++---------
 5 files changed, 78 insertions(+), 54 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/KeywordsManager.py b/pym/portage/package/ebuild/_config/KeywordsManager.py
index c2b8343..704ddca 100644
--- a/pym/portage/package/ebuild/_config/KeywordsManager.py
+++ b/pym/portage/package/ebuild/_config/KeywordsManager.py
@@ -20,7 +20,7 @@ class KeywordsManager(object):
 				global_accept_keywords=""):
 		self._pkeywords_list = []
 		rawpkeywords = [grabdict_package(
-			os.path.join(x, "package.keywords"), recursive=1,
+			os.path.join(x[0], "package.keywords"), recursive=x[1],
 			verify_eapi=True) \
 			for x in profiles]
 		for pkeyworddict in rawpkeywords:
@@ -35,7 +35,7 @@ class KeywordsManager(object):
 
 		self._p_accept_keywords = []
 		raw_p_accept_keywords = [grabdict_package(
-			os.path.join(x, "package.accept_keywords"), recursive=1,
+			os.path.join(x[0], "package.accept_keywords"), recursive=x[1],
 			verify_eapi=True) \
 			for x in profiles]
 		for d in raw_p_accept_keywords:

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index a465935..92c838c 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -121,8 +121,8 @@ class LocationsManager(object):
 				if os.path.isdir(os.path.join(currentPath, x)))
 			if offenders:
 				writemsg((_("Profile '%(profile_path)s' in repository "
-					"'%(repo_name)s' is using 'portage-1' profile format, but "
-					"the repository is not configured for it.  This will break "
+					"'%(repo_name)s' is implicitly using 'portage-1' profile format, but "
+					"the repository profiles are not marked as that format.  This will break "
 					"in the future.  Please either convert the following paths "
 					"to files, or add\nprofile-format = portage-1\nto the "
 					"repositories layout.conf.  Files: '%(files)s'\n")

diff --git a/pym/portage/package/ebuild/_config/MaskManager.py b/pym/portage/package/ebuild/_config/MaskManager.py
index 08acf92..a2bfb19 100644
--- a/pym/portage/package/ebuild/_config/MaskManager.py
+++ b/pym/portage/package/ebuild/_config/MaskManager.py
@@ -33,22 +33,33 @@ class MaskManager(object):
 		# repo may be often referenced by others as the master.
 		pmask_cache = {}
 
-		def grab_pmask(loc):
+		def grab_pmask(loc, repo_config):
 			if loc not in pmask_cache:
-				pmask_cache[loc] = grabfile_package(
-						os.path.join(loc, "profiles", "package.mask"),
-						recursive=1, remember_source_file=True, verify_eapi=True)
+				path = os.path.join(loc, 'profiles', 'package.mask')
+				pmask_cache[loc] = grabfile_package(path,
+						recursive=repo_config.portage1_profiles,
+						remember_source_file=True, verify_eapi=True)
+				if repo_config.portage1_profiles_compat and os.path.isdir(path):
+					writemsg((_("Repository '%(repo_name)s' is implicitly using "
+						"'portage-1' profile format in its profiles/package.mask, but "
+						"the repository profiles are not marked as that format.  This will break "
+						"in the future.  Please either convert the following paths "
+						"to files, or add\nprofile-format = portage-1\nto the "
+						"repositories layout.conf.\n")
+						% dict(repo_name=repo.name)),
+						noiselevel=-1)
+
 			return pmask_cache[loc]
 
 		repo_pkgmasklines = []
 		for repo in repositories.repos_with_profiles():
 			lines = []
-			repo_lines = grab_pmask(repo.location)
+			repo_lines = grab_pmask(repo.location, repo)
 			removals = frozenset(line[0][1:] for line in repo_lines
 				if line[0][:1] == "-")
 			matched_removals = set()
 			for master in repo.masters:
-				master_lines = grab_pmask(master.location)
+				master_lines = grab_pmask(master.location, master)
 				for line in master_lines:
 					if line[0] in removals:
 						matched_removals.add(line[0])
@@ -91,6 +102,8 @@ class MaskManager(object):
 
 		repo_pkgunmasklines = []
 		for repo in repositories.repos_with_profiles():
+			if not repo.portage1_profiles:
+				continue
 			repo_lines = grabfile_package(os.path.join(repo.location, "profiles", "package.unmask"), \
 				recursive=1, remember_source_file=True, verify_eapi=True)
 			lines = stack_lists([repo_lines], incremental=1, \
@@ -102,11 +115,12 @@ class MaskManager(object):
 		#to allow profiles to override masks from their parent profiles.
 		profile_pkgmasklines = []
 		profile_pkgunmasklines = []
-		for x in profiles:
+		for x, portage1_mode in profiles:
 			profile_pkgmasklines.append(grabfile_package(
-				os.path.join(x, "package.mask"), recursive=1, remember_source_file=True, verify_eapi=True))
-			profile_pkgunmasklines.append(grabfile_package(
-				os.path.join(x, "package.unmask"), recursive=1, remember_source_file=True, verify_eapi=True))
+				os.path.join(x, "package.mask"), recursive=portage1_mode, remember_source_file=True, verify_eapi=True))
+			if portage1_mode:
+				profile_pkgunmasklines.append(grabfile_package(
+					os.path.join(x, "package.unmask"), recursive=1, remember_source_file=True, verify_eapi=True))
 		profile_pkgmasklines = stack_lists(profile_pkgmasklines, incremental=1, \
 			remember_source_file=True, warn_for_unmatched_removal=True,
 			strict_warn_for_unmatched_removal=strict_umatched_removal)

diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py
index d7ef0f6..bf06bd7 100644
--- a/pym/portage/package/ebuild/_config/UseManager.py
+++ b/pym/portage/package/ebuild/_config/UseManager.py
@@ -65,9 +65,9 @@ class UseManager(object):
 
 		self.repositories = repositories
 	
-	def _parse_file_to_tuple(self, file_name):
+	def _parse_file_to_tuple(self, file_name, recursive=True):
 		ret = []
-		lines = grabfile(file_name, recursive=1)
+		lines = grabfile(file_name, recursive=recursive)
 		eapi = read_corresponding_eapi_file(file_name)
 		useflag_re = _get_useflag_re(eapi)
 		for prefixed_useflag in lines:
@@ -82,10 +82,10 @@ class UseManager(object):
 				ret.append(prefixed_useflag)
 		return tuple(ret)
 
-	def _parse_file_to_dict(self, file_name, juststrings=False):
+	def _parse_file_to_dict(self, file_name, juststrings=False, recursive=True):
 		ret = {}
 		location_dict = {}
-		file_dict = grabdict_package(file_name, recursive=1, verify_eapi=True)
+		file_dict = grabdict_package(file_name, recursive=recursive, verify_eapi=True)
 		eapi = read_corresponding_eapi_file(file_name)
 		useflag_re = _get_useflag_re(eapi)
 		for k, v in file_dict.items():
@@ -132,10 +132,12 @@ class UseManager(object):
 		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)
+		return tuple(self._parse_file_to_tuple(os.path.join(profile[0], file_name), recursive=profile[1])
+			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)
+		return tuple(self._parse_file_to_dict(os.path.join(profile[0], file_name), juststrings, recursive=profile[1])
+			for profile in locations)
 
 	def getUseMask(self, pkg=None):
 		if pkg is None:

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index c4c5e66..cfbbad4 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -210,6 +210,7 @@ class config(object):
 			self.module_priority = clone.module_priority
 			self.profile_path = clone.profile_path
 			self.profiles = clone.profiles
+			self.profiles_complex = clone.profiles_complex
 			self.packages = clone.packages
 			self.repositories = clone.repositories
 			self._iuse_implicit_match = clone._iuse_implicit_match
@@ -276,13 +277,9 @@ class config(object):
 			locations_manager = LocationsManager(config_root=config_root,
 				config_profile_path=config_profile_path, eprefix=eprefix,
 				local_config=local_config, target_root=target_root)
-			locations_manager.load_profiles([])
 
 			eprefix = locations_manager.eprefix
 			config_root = locations_manager.config_root
-			self.profiles = locations_manager.profiles
-			self.profile_path = locations_manager.profile_path
-			self.user_profile_dir = locations_manager.user_profile_dir
 			abs_user_config = locations_manager.abs_user_config
 
 			make_conf = getconfig(
@@ -301,6 +298,13 @@ class config(object):
 			eroot = locations_manager.eroot
 			self.global_config_path = locations_manager.global_config_path
 
+			make_globals = getconfig(os.path.join(self.global_config_path, 'make.globals'))
+			if make_globals is None:
+				make_globals = {}
+
+			for k, v in self._default_globals.items():
+				make_globals.setdefault(k, v)
+
 			if config_incrementals is None:
 				self.incrementals = INCREMENTALS
 			else:
@@ -342,19 +346,6 @@ class config(object):
 			self.configlist.append({})
 			self.configdict["pkginternal"] = self.configlist[-1]
 
-			self.packages_list = [grabfile_package(os.path.join(x, "packages"), verify_eapi=True) for x in self.profiles]
-			self.packages      = tuple(stack_lists(self.packages_list, incremental=1))
-			del self.packages_list
-			#self.packages = grab_stacked("packages", self.profiles, grabfile, incremental_lines=1)
-
-			# revmaskdict
-			self.prevmaskdict={}
-			for x in self.packages:
-				# Negative atoms are filtered by the above stack_lists() call.
-				if not isinstance(x, Atom):
-					x = Atom(x.lstrip('*'))
-				self.prevmaskdict.setdefault(x.cp, []).append(x)
-
 			# The expand_map is used for variable substitution
 			# in getconfig() calls, and the getconfig() calls
 			# update expand_map with the value of each variable
@@ -404,23 +395,39 @@ class config(object):
 
 			self.configdict["env"] = LazyItemsDict(self.backupenv)
 
-			for x in (self.global_config_path,):
-				self.mygcfg = getconfig(os.path.join(x, "make.globals"),
-					expand=expand_map)
-				if self.mygcfg:
-					break
-
-			if self.mygcfg is None:
-				self.mygcfg = {}
-
-			for k, v in self._default_globals.items():
-				self.mygcfg.setdefault(k, v)
-
-			self.configlist.append(self.mygcfg)
+			self.configlist.append(make_globals)
 			self.configdict["globals"]=self.configlist[-1]
 
 			self.make_defaults_use = []
 			self.mygcfg = {}
+
+			known_repos = []
+			for confs in [make_globals, make_conf, self.configdict["env"]]:
+				known_repos.extend(confs.get("PORTDIR", '').split())
+				known_repos.extend(confs.get("PORTDIR_OVERLAY", '').split())
+			known_repos = set(known_repos)
+
+			locations_manager.load_profiles(known_repos)
+
+			self.profiles = locations_manager.profiles
+			self.profiles_complex = locations_manager.profiles_complex
+			self.profile_path = locations_manager.profile_path
+			self.user_profile_dir = locations_manager.user_profile_dir
+
+			self.packages_list = [grabfile_package(os.path.join(x, "packages"), verify_eapi=True) for x in self.profiles]
+			self.packages      = tuple(stack_lists(self.packages_list, incremental=1))
+			del self.packages_list
+			#self.packages = grab_stacked("packages", self.profiles, grabfile, incremental_lines=1)
+
+			# revmaskdict
+			self.prevmaskdict={}
+			for x in self.packages:
+				# Negative atoms are filtered by the above stack_lists() call.
+				if not isinstance(x, Atom):
+					x = Atom(x.lstrip('*'))
+				self.prevmaskdict.setdefault(x.cp, []).append(x)
+
+
 			if self.profiles:
 				mygcfg_dlists = [getconfig(os.path.join(x, "make.defaults"),
 					expand=expand_map) for x in self.profiles]
@@ -550,11 +557,11 @@ class config(object):
 				self._repo_make_defaults[repo.name] = d
 
 			#Read package.keywords and package.accept_keywords.
-			self._keywords_manager = KeywordsManager(self.profiles, abs_user_config, \
+			self._keywords_manager = KeywordsManager(self.profiles_complex, abs_user_config, \
 				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.repositories, self.profiles, abs_user_config, user_config=local_config)
+			self._use_manager = UseManager(self.repositories, self.profiles_complex, 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()
@@ -571,7 +578,7 @@ class config(object):
 					self.configdict["conf"].get("ACCEPT_LICENSE", ""))
 
 			#Read package.mask and package.unmask from profiles and optionally from user config
-			self._mask_manager = MaskManager(self.repositories, self.profiles,
+			self._mask_manager = MaskManager(self.repositories, self.profiles_complex,
 				abs_user_config, user_config=local_config,
 				strict_umatched_removal=_unmatched_removal)
 
@@ -630,7 +637,8 @@ class config(object):
 			archlist = stack_lists(archlist, incremental=1)
 			self.configdict["conf"]["PORTAGE_ARCHLIST"] = " ".join(archlist)
 
-			pkgprovidedlines = [grabfile(os.path.join(x, "package.provided"), recursive=1) for x in self.profiles]
+			pkgprovidedlines = [grabfile(os.path.join(loc, "package.provided"), recursive=recursive)
+				for loc, recursive in self.profiles_complex]
 			pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
 			has_invalid_data = False
 			for x in range(len(pkgprovidedlines)-1, -1, -1):



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-10-25 21:44 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-10-25 21:44 UTC (permalink / raw
  To: gentoo-commits

commit:     9d4459dfea72717c0565b0cfe39fa3a87a57ad9d
Author:     Brian Harring <ferringb <AT> chromium <DOT> org>
AuthorDate: Tue Oct 25 05:37:34 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Oct 25 21:36:42 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=9d4459df

Track profile format, and if compatibility mode is in use.

Warn if the profile is using portage-1 format, but isn't marked as such.

---
 .../package/ebuild/_config/LocationsManager.py     |   67 ++++++++++++++++---
 pym/portage/package/ebuild/config.py               |    1 +
 2 files changed, 57 insertions(+), 11 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index 4072ffc..a465935 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -13,8 +13,14 @@ from portage.exception import DirectoryNotFound, ParseError
 from portage.localization import _
 from portage.util import ensure_dirs, grabfile, \
 	normalize_path, shlex_split, writemsg
+from portage.repository.config import parse_layout_conf
 
 
+_PORTAGE1_DIRECTORIES = frozenset([
+	'package.mask', 'package.provided',
+	'package.use', 'package.use.mask', 'package.use.force',
+	'use.mask', 'use.force'])
+
 class LocationsManager(object):
 
 	def __init__(self, config_root=None, eprefix=None, config_profile_path=None, local_config=True, \
@@ -37,17 +43,23 @@ class LocationsManager(object):
 
 		self._check_var_directory("PORTAGE_CONFIGROOT", self.config_root)
 		self.abs_user_config = os.path.join(self.config_root, USER_CONFIG_PATH)
+		self.config_profile_path = config_profile_path
+
+	def load_profiles(self, known_repository_paths):
+		known_repos = [os.path.abspath(x) for x in set(known_repository_paths)]
+		# force a trailing '/' for ease of doing startswith checks
+		known_repos = [(x + '/', parse_layout_conf(x)[0]) for x in known_repos]
 
-		if config_profile_path is None:
-			config_profile_path = \
+		if self.config_profile_path is None:
+			self.config_profile_path = \
 				os.path.join(self.config_root, PROFILE_PATH)
-			if os.path.isdir(config_profile_path):
-				self.profile_path = config_profile_path
+			if os.path.isdir(self.config_profile_path):
+				self.profile_path = self.config_profile_path
 			else:
-				config_profile_path = \
+				self.config_profile_path = \
 					os.path.join(self.abs_user_config, 'make.profile')
-				if os.path.isdir(config_profile_path):
-					self.profile_path = config_profile_path
+				if os.path.isdir(self.config_profile_path):
+					self.profile_path = self.config_profile_path
 				else:
 					self.profile_path = None
 		else:
@@ -55,14 +67,16 @@ class LocationsManager(object):
 			# here, in order to create an empty profile
 			# for checking dependencies of packages with
 			# empty KEYWORDS.
-			self.profile_path = config_profile_path
+			self.profile_path = self.config_profile_path
 
 
 		# The symlink might not exist or might not be a symlink.
 		self.profiles = []
+		self.profiles_complex = []
 		if self.profile_path:
 			try:
-				self._addProfile(os.path.realpath(self.profile_path))
+				self._addProfile(os.path.realpath(self.profile_path),
+					known_repos)
 			except ParseError as e:
 				writemsg(_("!!! Unable to parse profile: '%s'\n") % \
 					self.profile_path, noiselevel=-1)
@@ -75,9 +89,11 @@ class LocationsManager(object):
 			if os.path.exists(custom_prof):
 				self.user_profile_dir = custom_prof
 				self.profiles.append(custom_prof)
+				self.profiles_complex.append((custom_prof, True))
 			del custom_prof
 
 		self.profiles = tuple(self.profiles)
+		self.profiles_complex = tuple(self.profiles_complex)
 
 	def _check_var_directory(self, varname, var):
 		if not os.path.isdir(var):
@@ -86,7 +102,34 @@ class LocationsManager(object):
 				noiselevel=-1)
 			raise DirectoryNotFound(var)
 
-	def _addProfile(self, currentPath):
+	def _addProfile(self, currentPath, known_repos):
+		current_abs_path = os.path.abspath(currentPath)
+		allow_directories = True
+		compat_mode = False
+		intersecting_repos = [x for x in known_repos if current_abs_path.startswith(x[0])]
+		if intersecting_repos:
+			# protect against nested repositories.  Insane configuration, but the longest
+			# path will be the correct one.
+			repo_loc, layout_data = max(intersecting_repos, key=lambda x:len(x[0]))
+			allow_directories = any(x.startswith("portage-1")
+				for x in layout_data['profile-formats'])
+			compat_mode = layout_data['profile-formats'] == ('portage-1-compat',)
+
+		if compat_mode:
+			offenders = _PORTAGE1_DIRECTORIES.intersection(os.listdir(currentPath))
+			offenders = sorted(x for x in offenders
+				if os.path.isdir(os.path.join(currentPath, x)))
+			if offenders:
+				writemsg((_("Profile '%(profile_path)s' in repository "
+					"'%(repo_name)s' is using 'portage-1' profile format, but "
+					"the repository is not configured for it.  This will break "
+					"in the future.  Please either convert the following paths "
+					"to files, or add\nprofile-format = portage-1\nto the "
+					"repositories layout.conf.  Files: '%(files)s'\n")
+					% dict(profile_path=currentPath, repo_name=repo_loc,
+						files=', '.join(offenders))),
+					noiselevel=-1)
+
 		parentsFile = os.path.join(currentPath, "parent")
 		eapi_file = os.path.join(currentPath, "eapi")
 		f = None
@@ -115,12 +158,14 @@ class LocationsManager(object):
 				parentPath = normalize_path(os.path.join(
 					currentPath, parentPath))
 				if os.path.exists(parentPath):
-					self._addProfile(parentPath)
+					self._addProfile(parentPath, known_repos)
 				else:
 					raise ParseError(
 						_("Parent '%s' not found: '%s'") %  \
 						(parentPath, parentsFile))
+
 		self.profiles.append(currentPath)
+		self.profiles_complex.append((currentPath, allow_directories))
 
 	def set_root_override(self, root_overwrite=None):
 		# Allow ROOT setting to come from make.conf if it's not overridden

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index d49ac60..c4c5e66 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -276,6 +276,7 @@ class config(object):
 			locations_manager = LocationsManager(config_root=config_root,
 				config_profile_path=config_profile_path, eprefix=eprefix,
 				local_config=local_config, target_root=target_root)
+			locations_manager.load_profiles([])
 
 			eprefix = locations_manager.eprefix
 			config_root = locations_manager.config_root



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-10-27 18:32 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-10-27 18:32 UTC (permalink / raw
  To: gentoo-commits

commit:     310da49821ea455a88ac55e3901fb6f9fcb79e21
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Thu Oct 27 18:29:33 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Oct 27 18:29:33 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=310da498

LocationsManager.load_profiles: realpath repos

Since we already call realpath on make.profile, we also need to call
realpath on the repo paths that we compare its nodes to.

---
 .../package/ebuild/_config/LocationsManager.py     |    5 +++--
 pym/portage/package/ebuild/config.py               |    2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index a4098ba..debabed 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -48,9 +48,10 @@ class LocationsManager(object):
 		self.config_profile_path = config_profile_path
 
 	def load_profiles(self, known_repository_paths):
-		known_repos = [os.path.abspath(x) for x in set(known_repository_paths)]
+		known_repos = set(os.path.realpath(x) for x in known_repository_paths)
 		# force a trailing '/' for ease of doing startswith checks
-		known_repos = [(x + '/', parse_layout_conf(x)[0]) for x in known_repos]
+		known_repos = tuple((x + '/', parse_layout_conf(x)[0])
+			for x in known_repos)
 
 		if self.config_profile_path is None:
 			self.config_profile_path = \

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index cfbbad4..34a326e 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -405,7 +405,7 @@ class config(object):
 			for confs in [make_globals, make_conf, self.configdict["env"]]:
 				known_repos.extend(confs.get("PORTDIR", '').split())
 				known_repos.extend(confs.get("PORTDIR_OVERLAY", '').split())
-			known_repos = set(known_repos)
+			known_repos = frozenset(known_repos)
 
 			locations_manager.load_profiles(known_repos)
 



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2011-10-27 20:49 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2011-10-27 20:49 UTC (permalink / raw
  To: gentoo-commits

commit:     10202ff80ebd212457db95d76ca1fbc79567bf8d
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Thu Oct 27 20:49:40 2011 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Oct 27 20:49:40 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=10202ff8

LocationsManager: extensible _profile_node object

Use immutable object attrubutes instead of tuples, for extensibility.

---
 .../package/ebuild/_config/KeywordsManager.py      |    6 ++++--
 .../package/ebuild/_config/LocationsManager.py     |   17 +++++++++++++++--
 pym/portage/package/ebuild/_config/MaskManager.py  |   12 ++++++++----
 pym/portage/package/ebuild/_config/UseManager.py   |    8 ++++++--
 pym/portage/package/ebuild/config.py               |    6 ++++--
 5 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/KeywordsManager.py b/pym/portage/package/ebuild/_config/KeywordsManager.py
index 704ddca..2f9f7b3 100644
--- a/pym/portage/package/ebuild/_config/KeywordsManager.py
+++ b/pym/portage/package/ebuild/_config/KeywordsManager.py
@@ -20,7 +20,8 @@ class KeywordsManager(object):
 				global_accept_keywords=""):
 		self._pkeywords_list = []
 		rawpkeywords = [grabdict_package(
-			os.path.join(x[0], "package.keywords"), recursive=x[1],
+			os.path.join(x.location, "package.keywords"),
+			recursive=x.portage1_directories,
 			verify_eapi=True) \
 			for x in profiles]
 		for pkeyworddict in rawpkeywords:
@@ -35,7 +36,8 @@ class KeywordsManager(object):
 
 		self._p_accept_keywords = []
 		raw_p_accept_keywords = [grabdict_package(
-			os.path.join(x[0], "package.accept_keywords"), recursive=x[1],
+			os.path.join(x.location, "package.accept_keywords"),
+			recursive=x.portage1_directories,
 			verify_eapi=True) \
 			for x in profiles]
 		for d in raw_p_accept_keywords:

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index d793625..ec3f003 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -23,6 +23,18 @@ _PORTAGE1_DIRECTORIES = frozenset([
 	'package.use', 'package.use.mask', 'package.use.force',
 	'use.mask', 'use.force'])
 
+class _profile_node(object):
+
+	__slots__ = ('location', 'portage1_directories')
+
+	def __init__(self, location, portage1_directories):
+		object.__setattr__(self, 'location', location)
+		object.__setattr__(self, 'portage1_directories', portage1_directories)
+
+	def __setattr__(self, name, value):
+		raise AttributeError("_profile_node instances are immutable",
+			self.__class__, name, value)
+
 class LocationsManager(object):
 
 	def __init__(self, config_root=None, eprefix=None, config_profile_path=None, local_config=True, \
@@ -92,7 +104,7 @@ class LocationsManager(object):
 			if os.path.exists(custom_prof):
 				self.user_profile_dir = custom_prof
 				self.profiles.append(custom_prof)
-				self.profiles_complex.append((custom_prof, True))
+				self.profiles_complex.append(_profile_node(custom_prof, True))
 			del custom_prof
 
 		self.profiles = tuple(self.profiles)
@@ -177,7 +189,8 @@ class LocationsManager(object):
 						(parentPath, parentsFile))
 
 		self.profiles.append(currentPath)
-		self.profiles_complex.append((currentPath, allow_directories))
+		self.profiles_complex.append(
+			_profile_node(currentPath, allow_directories))
 
 	def set_root_override(self, root_overwrite=None):
 		# Allow ROOT setting to come from make.conf if it's not overridden

diff --git a/pym/portage/package/ebuild/_config/MaskManager.py b/pym/portage/package/ebuild/_config/MaskManager.py
index a2bfb19..6b0f1c3 100644
--- a/pym/portage/package/ebuild/_config/MaskManager.py
+++ b/pym/portage/package/ebuild/_config/MaskManager.py
@@ -115,12 +115,16 @@ class MaskManager(object):
 		#to allow profiles to override masks from their parent profiles.
 		profile_pkgmasklines = []
 		profile_pkgunmasklines = []
-		for x, portage1_mode in profiles:
+		for x in profiles:
 			profile_pkgmasklines.append(grabfile_package(
-				os.path.join(x, "package.mask"), recursive=portage1_mode, remember_source_file=True, verify_eapi=True))
-			if portage1_mode:
+				os.path.join(x.location, "package.mask"),
+				recursive=x.portage1_directories,
+				remember_source_file=True, verify_eapi=True))
+			if x.portage1_directories:
 				profile_pkgunmasklines.append(grabfile_package(
-					os.path.join(x, "package.unmask"), recursive=1, remember_source_file=True, verify_eapi=True))
+					os.path.join(x.location, "package.unmask"),
+					recursive=x.portage1_directories,
+					remember_source_file=True, verify_eapi=True))
 		profile_pkgmasklines = stack_lists(profile_pkgmasklines, incremental=1, \
 			remember_source_file=True, warn_for_unmatched_removal=True,
 			strict_warn_for_unmatched_removal=strict_umatched_removal)

diff --git a/pym/portage/package/ebuild/_config/UseManager.py b/pym/portage/package/ebuild/_config/UseManager.py
index bf06bd7..0506af0 100644
--- a/pym/portage/package/ebuild/_config/UseManager.py
+++ b/pym/portage/package/ebuild/_config/UseManager.py
@@ -132,11 +132,15 @@ class UseManager(object):
 		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[0], file_name), recursive=profile[1])
+		return tuple(self._parse_file_to_tuple(
+			os.path.join(profile.location, file_name),
+			recursive=profile.portage1_directories)
 			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[0], file_name), juststrings, recursive=profile[1])
+		return tuple(self._parse_file_to_dict(
+			os.path.join(profile.location, file_name), juststrings,
+			recursive=profile.portage1_directories)
 			for profile in locations)
 
 	def getUseMask(self, pkg=None):

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 34a326e..47ea7f8 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -637,8 +637,10 @@ class config(object):
 			archlist = stack_lists(archlist, incremental=1)
 			self.configdict["conf"]["PORTAGE_ARCHLIST"] = " ".join(archlist)
 
-			pkgprovidedlines = [grabfile(os.path.join(loc, "package.provided"), recursive=recursive)
-				for loc, recursive in self.profiles_complex]
+			pkgprovidedlines = [grabfile(
+				os.path.join(x.location, "package.provided"),
+				recursive=x.portage1_directories)
+				for x in self.profiles_complex]
 			pkgprovidedlines = stack_lists(pkgprovidedlines, incremental=1)
 			has_invalid_data = False
 			for x in range(len(pkgprovidedlines)-1, -1, -1):



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/
@ 2013-01-24 21:53 Zac Medico
  0 siblings, 0 replies; 8+ messages in thread
From: Zac Medico @ 2013-01-24 21:53 UTC (permalink / raw
  To: gentoo-commits

commit:     082d3ef7ff047e40873e03f0b068a2942dda3fc1
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Thu Jan 24 21:53:04 2013 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Jan 24 21:53:04 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=082d3ef7

config: raise PermissionDenied more

This enables clear reporting of "Permission Denied" when appropriate,
instead of triggering nonsensical messages about invalid profiles or
repositories.

---
 .../package/ebuild/_config/LocationsManager.py     |   15 ++++++++-------
 pym/portage/package/ebuild/config.py               |    7 ++++---
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/pym/portage/package/ebuild/_config/LocationsManager.py b/pym/portage/package/ebuild/_config/LocationsManager.py
index 8f88e49..95a7751 100644
--- a/pym/portage/package/ebuild/_config/LocationsManager.py
+++ b/pym/portage/package/ebuild/_config/LocationsManager.py
@@ -18,6 +18,7 @@ from portage.exception import DirectoryNotFound, ParseError
 from portage.localization import _
 from portage.util import ensure_dirs, grabfile, \
 	normalize_path, shlex_split, writemsg
+from portage.util._path import exists_raise_eaccess, isdir_raise_eaccess
 from portage.repository.config import parse_layout_conf, \
 	_portage1_profiles_allow_directories
 
@@ -77,9 +78,9 @@ class LocationsManager(object):
 				self.config_root, 'etc', 'make.profile')
 			self.config_profile_path = \
 				os.path.join(self.config_root, PROFILE_PATH)
-			if os.path.isdir(self.config_profile_path):
+			if isdir_raise_eaccess(self.config_profile_path):
 				self.profile_path = self.config_profile_path
-				if os.path.isdir(deprecated_profile_path) and not \
+				if isdir_raise_eaccess(deprecated_profile_path) and not \
 					os.path.samefile(self.profile_path,
 					deprecated_profile_path):
 					# Don't warn if they refer to the same path, since
@@ -92,7 +93,7 @@ class LocationsManager(object):
 						noiselevel=-1)
 			else:
 				self.config_profile_path = deprecated_profile_path
-				if os.path.isdir(self.config_profile_path):
+				if isdir_raise_eaccess(self.config_profile_path):
 					self.profile_path = self.config_profile_path
 				else:
 					self.profile_path = None
@@ -132,7 +133,7 @@ class LocationsManager(object):
 		self.profiles_complex = tuple(self.profiles_complex)
 
 	def _check_var_directory(self, varname, var):
-		if not os.path.isdir(var):
+		if not isdir_raise_eaccess(var):
 			writemsg(_("!!! Error: %s='%s' is not a directory. "
 				"Please correct this.\n") % (varname, var),
 				noiselevel=-1)
@@ -192,7 +193,7 @@ class LocationsManager(object):
 						files=', '.join(offenders)))
 
 		parentsFile = os.path.join(currentPath, "parent")
-		if os.path.exists(parentsFile):
+		if exists_raise_eaccess(parentsFile):
 			parents = grabfile(parentsFile)
 			if not parents:
 				raise ParseError(
@@ -214,7 +215,7 @@ class LocationsManager(object):
 					# of the current repo, so realpath it.
 					parentPath = os.path.realpath(parentPath)
 
-				if os.path.exists(parentPath):
+				if exists_raise_eaccess(parentPath):
 					self._addProfile(parentPath, repositories, known_repos)
 				else:
 					raise ParseError(
@@ -305,7 +306,7 @@ class LocationsManager(object):
 		for ov in shlex_split(self.portdir_overlay):
 			ov = normalize_path(ov)
 			profiles_dir = os.path.join(ov, "profiles")
-			if os.path.isdir(profiles_dir):
+			if isdir_raise_eaccess(profiles_dir):
 				self.overlay_profiles.append(profiles_dir)
 
 		self.profile_locations = [os.path.join(portdir, "profiles")] + self.overlay_profiles

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 0ea0841..352b298 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -46,6 +46,7 @@ from portage.util import ensure_dirs, getconfig, grabdict, \
 	grabdict_package, grabfile, grabfile_package, LazyItemsDict, \
 	normalize_path, shlex_split, stack_dictlist, stack_dicts, stack_lists, \
 	writemsg, writemsg_level, _eapi_cache
+from portage.util._path import exists_raise_eaccess, isdir_raise_eaccess
 from portage.versions import catpkgsplit, catsplit, cpv_getkey, _pkg_str
 
 from portage.package.ebuild._config import special_env_vars
@@ -620,7 +621,7 @@ class config(object):
 				shell_quote_re = re.compile(r"[\s\\\"'$`]")
 				for ov in portdir_overlay:
 					ov = normalize_path(ov)
-					if os.path.isdir(ov):
+					if isdir_raise_eaccess(ov):
 						if shell_quote_re.search(ov) is not None:
 							ov = portage._shell_quote(ov)
 						new_ov.append(ov)
@@ -1006,8 +1007,8 @@ class config(object):
 						noiselevel=-1)
 
 		profile_broken = not self.profile_path or \
-			not os.path.exists(os.path.join(self.profile_path, "parent")) and \
-			os.path.exists(os.path.join(self["PORTDIR"], "profiles"))
+			not exists_raise_eaccess(os.path.join(self.profile_path, "parent")) and \
+			exists_raise_eaccess(os.path.join(self["PORTDIR"], "profiles"))
 
 		if profile_broken:
 			abs_profile_path = None


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-01-24 21:53 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-27  0:34 [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/package/ebuild/_config/ Zac Medico
  -- strict thread matches above, loose matches on Subject: below --
2013-01-24 21:53 Zac Medico
2011-10-27 20:49 Zac Medico
2011-10-27 18:32 Zac Medico
2011-10-25 21:44 Zac Medico
2011-10-25 21:44 Zac Medico
2011-06-21  3:27 Zac Medico
2011-06-19 16:40 Arfrever Frehtes Taifersar Arahesis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox