public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/dbapi/, ...
Date: Sat, 25 Aug 2012 04:14:25 +0000 (UTC)	[thread overview]
Message-ID: <1345867727.741093a384ff8256965ec4842664216cf911bcb5.zmedico@gentoo> (raw)

commit:     741093a384ff8256965ec4842664216cf911bcb5
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Aug 25 04:08:47 2012 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Aug 25 04:08:47 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=741093a3

_pkg_str: pass in config + metadata with KEYWORDS

This will be needed in order to support stable use.mask/force for
bug #431078.

---
 pym/_emerge/Package.py                             |   15 +++++++++++----
 pym/portage/dbapi/__init__.py                      |   16 ++++++++--------
 pym/portage/dbapi/porttree.py                      |    4 ++--
 pym/portage/dbapi/virtual.py                       |    4 ++--
 pym/portage/dep/dep_check.py                       |   19 ++++---------------
 .../package/ebuild/_config/KeywordsManager.py      |   15 +++++++++------
 pym/portage/package/ebuild/config.py               |   10 ++++++----
 pym/portage/package/ebuild/getmaskingstatus.py     |    7 ++++---
 pym/portage/tests/ebuild/test_doebuild_spawn.py    |    2 ++
 pym/portage/versions.py                            |   13 +++++++++++--
 10 files changed, 59 insertions(+), 46 deletions(-)

diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py
index 14d0694..c8a0c90 100644
--- a/pym/_emerge/Package.py
+++ b/pym/_emerge/Package.py
@@ -17,6 +17,9 @@ from _emerge.Task import Task
 if sys.hexversion >= 0x3000000:
 	basestring = str
 	long = int
+	_unicode = str
+else:
+	_unicode = unicode
 
 class Package(Task):
 
@@ -51,9 +54,8 @@ class Package(Task):
 		if not self.built:
 			self.metadata['CHOST'] = self.root_config.settings.get('CHOST', '')
 		eapi_attrs = _get_eapi_attrs(self.metadata["EAPI"])
-		self.cpv = _pkg_str(self.cpv, slot=self.metadata["SLOT"],
-			repo=self.metadata.get('repository', ''),
-			eapi=self.metadata["EAPI"])
+		self.cpv = _pkg_str(self.cpv, metadata=self.metadata,
+			settings=self.root_config.settings)
 		if hasattr(self.cpv, 'slot_invalid'):
 			self._invalid_metadata('SLOT.invalid',
 				"SLOT: invalid value: '%s'" % self.metadata["SLOT"])
@@ -87,6 +89,11 @@ class Package(Task):
 			type_name=self.type_name)
 		self._hash_value = hash(self._hash_key)
 
+	# For consistency with _pkg_str
+	@property
+	def _metadata(self):
+		return self.metadata
+
 	# These are calculated on-demand, so that they are calculated
 	# after FakeVartree applies its metadata tweaks.
 	@property
@@ -154,7 +161,7 @@ class Package(Task):
 			# So overwrite the repo_key with type_name.
 			repo_key = type_name
 
-		return (type_name, root, cpv, operation, repo_key)
+		return (type_name, root, _unicode(cpv), operation, repo_key)
 
 	def _validate_deps(self):
 		"""

diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py
index b999fb5..97b4255 100644
--- a/pym/portage/dbapi/__init__.py
+++ b/pym/portage/dbapi/__init__.py
@@ -25,7 +25,7 @@ class dbapi(object):
 	_use_mutable = False
 	_known_keys = frozenset(x for x in auxdbkeys
 		if not x.startswith("UNUSED_0"))
-	_pkg_str_aux_keys = ("EAPI", "SLOT", "repository")
+	_pkg_str_aux_keys = ("EAPI", "KEYWORDS", "SLOT", "repository")
 
 	def __init__(self):
 		pass
@@ -153,8 +153,7 @@ class dbapi(object):
 		metadata = dict(zip(self._pkg_str_aux_keys,
 			self.aux_get(cpv, self._pkg_str_aux_keys, myrepo=repo)))
 
-		return _pkg_str(cpv, slot=metadata["SLOT"],
-			repo=metadata["repository"], eapi=metadata["EAPI"])
+		return _pkg_str(cpv, metadata=metadata, settings=self.settings)
 
 	def _iter_match_repo(self, atom, cpv_iter):
 		for cpv in cpv_iter:
@@ -182,7 +181,7 @@ class dbapi(object):
 		2) Check enabled/disabled flag states.
 		"""
 
-		aux_keys = ["IUSE", "SLOT", "USE", "repository"]
+		aux_keys = ["IUSE", "KEYWORDS", "SLOT", "USE", "repository"]
 		for cpv in cpv_iter:
 			try:
 				metadata = dict(zip(aux_keys,
@@ -234,11 +233,12 @@ class dbapi(object):
 
 		elif not self.settings.local_config:
 			# Check masked and forced flags for repoman.
-			if hasattr(cpv, 'slot'):
-				pkg = cpv
+			try:
+				cpv.slot
+			except AttributeError:
+				pkg = _pkg_str(cpv, metadata=metadata, settings=self.settings)
 			else:
-				pkg = _pkg_str(cpv, slot=metadata["SLOT"],
-					repo=metadata.get("repository"))
+				pkg = cpv
 			usemask = self.settings._getUseMask(pkg)
 			if any(x in usemask for x in atom.use.enabled):
 				return False

diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
index 945c22c..0cb290f 100644
--- a/pym/portage/dbapi/porttree.py
+++ b/pym/portage/dbapi/porttree.py
@@ -827,8 +827,8 @@ class portdbapi(dbapi):
 						continue
 
 					try:
-						pkg_str = _pkg_str(cpv, slot=metadata["SLOT"],
-							repo=metadata["repository"], eapi=metadata["EAPI"])
+						pkg_str = _pkg_str(cpv, metadata=metadata,
+							settings=self.settings)
 					except InvalidData:
 						continue
 

diff --git a/pym/portage/dbapi/virtual.py b/pym/portage/dbapi/virtual.py
index 213708c..30d6c22 100644
--- a/pym/portage/dbapi/virtual.py
+++ b/pym/portage/dbapi/virtual.py
@@ -89,8 +89,8 @@ class fakedbapi(dbapi):
 			if metadata is None:
 				mycpv = _pkg_str(mycpv)
 			else:
-				mycpv = _pkg_str(mycpv, slot=metadata.get('SLOT'),
-					repo=metadata.get('repository'), eapi=metadata.get('EAPI'))
+				mycpv = _pkg_str(mycpv, metadata=metadata,
+					settings=self.settings)
 
 			mycp = mycpv.cp
 			try:

diff --git a/pym/portage/dep/dep_check.py b/pym/portage/dep/dep_check.py
index d575ab3..ecb8a9b 100644
--- a/pym/portage/dep/dep_check.py
+++ b/pym/portage/dep/dep_check.py
@@ -350,14 +350,8 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
 			avail_pkg = mydbapi.match(atom.without_use)
 			if avail_pkg:
 				avail_pkg = avail_pkg[-1] # highest (ascending order)
-				try:
-					slot = avail_pkg.slot
-				except AttributeError:
-					eapi, slot, repo = mydbapi.aux_get(avail_pkg,
-						["EAPI", "SLOT", "repository"])
-					avail_pkg = _pkg_str(avail_pkg, eapi=eapi,
-						slot=slot, repo=repo)
-				avail_slot = Atom("%s:%s" % (atom.cp, slot))
+				avail_pkg = mydbapi._pkg_str(avail_pkg, atom.repo)
+				avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
 			if not avail_pkg:
 				all_available = False
 				all_use_satisfied = False
@@ -372,13 +366,8 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
 					avail_pkg_use = avail_pkg_use[-1]
 					if avail_pkg_use != avail_pkg:
 						avail_pkg = avail_pkg_use
-						try:
-							slot = avail_pkg.slot
-						except AttributeError:
-							eapi, slot, repo = mydbapi.aux_get(avail_pkg,
-								["EAPI", "SLOT", "repository"])
-							avail_pkg = _pkg_str(avail_pkg,
-								eapi=eapi, slot=slot, repo=repo)
+					avail_pkg = mydbapi._pkg_str(avail_pkg, atom.repo)
+					avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
 
 			slot_map[avail_slot] = avail_pkg
 			highest_cpv = cp_map.get(avail_pkg.cp)

diff --git a/pym/portage/package/ebuild/_config/KeywordsManager.py b/pym/portage/package/ebuild/_config/KeywordsManager.py
index 0c613ce..74c7d0a 100644
--- a/pym/portage/package/ebuild/_config/KeywordsManager.py
+++ b/pym/portage/package/ebuild/_config/KeywordsManager.py
@@ -11,7 +11,7 @@ from portage.dep import ExtendedAtomDict, _repo_separator, _slot_separator
 from portage.localization import _
 from portage.package.ebuild._config.helper import ordered_by_atom_specificity
 from portage.util import grabdict_package, stack_lists, writemsg
-from portage.versions import cpv_getkey, _pkg_str
+from portage.versions import _pkg_str
 
 class KeywordsManager(object):
 	"""Manager class to handle keywords processing and validation"""
@@ -77,7 +77,9 @@ class KeywordsManager(object):
 
 
 	def getKeywords(self, cpv, slot, keywords, repo):
-		if not hasattr(cpv, 'slot'):
+		try:
+			cpv.slot
+		except AttributeError:
 			pkg = _pkg_str(cpv, slot=slot, repo=repo)
 		else:
 			pkg = cpv
@@ -237,7 +239,7 @@ class KeywordsManager(object):
 			if not mygroups:
 				# If KEYWORDS is empty then we still have to return something
 				# in order to distinguish from the case of "none missing".
-				mygroups.append("**")
+				mygroups = ["**"]
 			missing = mygroups
 		return missing
 
@@ -261,9 +263,11 @@ class KeywordsManager(object):
 		"""
 
 		pgroups = global_accept_keywords.split()
-		if not hasattr(cpv, 'slot'):
+		try:
+			cpv.slot
+		except AttributeError:
 			cpv = _pkg_str(cpv, slot=slot, repo=repo)
-		cp = cpv_getkey(cpv)
+		cp = cpv.cp
 
 		unmaskgroups = []
 		if self._p_accept_keywords:
@@ -288,4 +292,3 @@ class KeywordsManager(object):
 				for x in pkg_accept_keywords:
 					unmaskgroups.extend(x)
 		return unmaskgroups
-

diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 4d871f4..94c0bbc 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -1284,7 +1284,8 @@ class config(object):
 			slot = pkg_configdict["SLOT"]
 			iuse = pkg_configdict["IUSE"]
 			if pkg is None:
-				cpv_slot = _pkg_str(self.mycpv, slot=slot, repo=repository)
+				cpv_slot = _pkg_str(self.mycpv, metadata=pkg_configdict,
+					settings=self)
 			else:
 				cpv_slot = pkg
 			pkginternaluse = []
@@ -1740,9 +1741,10 @@ class config(object):
 		@return: A list of properties that have not been accepted.
 		"""
 		accept_properties = self._accept_properties
-		if not hasattr(cpv, 'slot'):
-			cpv = _pkg_str(cpv, slot=metadata["SLOT"],
-				repo=metadata.get("repository"))
+		try:
+			cpv.slot
+		except AttributeError:
+			cpv = _pkg_str(cpv, metadata=metadata, settings=self)
 		cp = cpv_getkey(cpv)
 		cpdict = self._ppropertiesdict.get(cp)
 		if cpdict:

diff --git a/pym/portage/package/ebuild/getmaskingstatus.py b/pym/portage/package/ebuild/getmaskingstatus.py
index 9bf605d..954abce 100644
--- a/pym/portage/package/ebuild/getmaskingstatus.py
+++ b/pym/portage/package/ebuild/getmaskingstatus.py
@@ -65,10 +65,11 @@ def _getmaskingstatus(mycpv, settings, portdb, myrepo=None):
 		else:
 			metadata["USE"] = ""
 
-	if not hasattr(mycpv, 'slot'):
+	try:
+		mycpv.slot
+	except AttributeError:
 		try:
-			mycpv = _pkg_str(mycpv, slot=metadata['SLOT'],
-				repo=metadata.get('repository'))
+			mycpv = _pkg_str(mycpv, metadata=metadata, settings=settings)
 		except portage.exception.InvalidData:
 			raise ValueError(_("invalid CPV: %s") % mycpv)
 

diff --git a/pym/portage/tests/ebuild/test_doebuild_spawn.py b/pym/portage/tests/ebuild/test_doebuild_spawn.py
index 89e27a3..a0a80ac 100644
--- a/pym/portage/tests/ebuild/test_doebuild_spawn.py
+++ b/pym/portage/tests/ebuild/test_doebuild_spawn.py
@@ -36,10 +36,12 @@ class DoebuildSpawnTestCase(TestCase):
 				'EAPI'      : '2',
 				'INHERITED' : 'python eutils',
 				'IUSE'      : 'build doc epydoc python3 selinux',
+				'KEYWORDS'  : 'x86',
 				'LICENSE'   : 'GPL-2',
 				'PROVIDE'   : 'virtual/portage',
 				'RDEPEND'   : '>=app-shells/bash-3.2_p17 >=dev-lang/python-2.6',
 				'SLOT'      : '0',
+				'repository': 'gentoo',
 			}
 			root_config = playground.trees[playground.eroot]['root_config']
 			pkg = Package(built=False, cpv=cpv, installed=False,

diff --git a/pym/portage/versions.py b/pym/portage/versions.py
index 2794753..36eb8ac 100644
--- a/pym/portage/versions.py
+++ b/pym/portage/versions.py
@@ -337,14 +337,23 @@ class _pkg_str(_unicode):
 	manually convert them to a plain unicode object first.
 	"""
 
-	def __new__(cls, cpv, slot=None, repo=None, eapi=None):
+	def __new__(cls, cpv, metadata=None, settings=None, eapi=None,
+		repo=None, slot=None):
 		return _unicode.__new__(cls, cpv)
 
-	def __init__(self, cpv, slot=None, repo=None, eapi=None):
+	def __init__(self, cpv, metadata=None, settings=None, eapi=None,
+		repo=None, slot=None):
 		if not isinstance(cpv, _unicode):
 			# Avoid TypeError from _unicode.__init__ with PyPy.
 			cpv = _unicode_decode(cpv)
 		_unicode.__init__(cpv)
+		if metadata is not None:
+			self.__dict__['_metadata'] = metadata
+			slot = metadata.get('SLOT', slot)
+			repo = metadata.get('repository', repo)
+			eapi = metadata.get('EAPI', eapi)
+		if settings is not None:
+			self.__dict__['_settings'] = settings
 		if eapi is not None:
 			self.__dict__['eapi'] = eapi
 		self.__dict__['cpv_split'] = catpkgsplit(cpv, eapi=eapi)


             reply	other threads:[~2012-08-25  4:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-25  4:14 Zac Medico [this message]
  -- strict thread matches above, loose matches on Subject: below --
2013-02-11  6:35 [gentoo-commits] proj/portage:master commit in: pym/portage/package/ebuild/, pym/portage/dbapi/, Zac Medico
2012-11-16  4:44 Arfrever Frehtes Taifersar Arahesis
2012-05-13  1:07 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=1345867727.741093a384ff8256965ec4842664216cf911bcb5.zmedico@gentoo \
    --to=zmedico@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