From 741093a384ff8256965ec4842664216cf911bcb5 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 24 Aug 2012 21:08:47 -0700 Subject: _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 ++++--------------- pym/portage/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 14d069449..c8a0c9042 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 b999fb5df..97b425558 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 945c22c3d..0cb290fb4 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 213708c93..30d6c227f 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 d575ab3bc..ecb8a9b4e 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 0c613ce04..74c7d0a2c 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 4d871f428..94c0bbc79 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 9bf605db6..954abced9 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 89e27a331..a0a80ace4 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 27947532b..36eb8ac21 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) -- cgit v1.2.3-1-g7c22