_pkg_str: pass in config + metadata with KEYWORDS
authorZac Medico <zmedico@gentoo.org>
Sat, 25 Aug 2012 04:08:47 +0000 (21:08 -0700)
committerZac Medico <zmedico@gentoo.org>
Sat, 25 Aug 2012 04:08:47 +0000 (21:08 -0700)
This will be needed in order to support stable use.mask/force for
bug #431078.

pym/_emerge/Package.py
pym/portage/dbapi/__init__.py
pym/portage/dbapi/porttree.py
pym/portage/dbapi/virtual.py
pym/portage/dep/dep_check.py
pym/portage/package/ebuild/_config/KeywordsManager.py
pym/portage/package/ebuild/config.py
pym/portage/package/ebuild/getmaskingstatus.py
pym/portage/tests/ebuild/test_doebuild_spawn.py
pym/portage/versions.py

index 14d069449782d3baa9f87567cc48bdeef04ebb14..c8a0c9042dc973008936da5d33df10b0c47b8d9a 100644 (file)
@@ -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):
                """
index b999fb5dfbacd5641ffc4e42f164a853d5a64770..97b4255589375eadf48fed822657731e8bc5d66f 100644 (file)
@@ -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
index 945c22c3dec6ca353f554672078c1552b8146fb7..0cb290fb4a22fbaa921c88d7b6e6b9693328ffd6 100644 (file)
@@ -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
 
index 213708c93e5afc0739df868fbfe65ae38545f32e..30d6c227fe54c848a6bfca69a6c270c226148c0f 100644 (file)
@@ -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:
index d575ab3bca143f014d385eceea9ae00123d8ce78..ecb8a9b4e71bba18a372f030e2c3f259df1bdb59 100644 (file)
@@ -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)
index 0c613ce04f9cd294cfb8e06454f1a88940f44457..74c7d0a2cb1ebb6ab2534e58b53acf662d643fb4 100644 (file)
@@ -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
-
index 4d871f428d06669e303e7b2c2bad16b840d6c519..94c0bbc797aad84a38456326324b49393c4575b6 100644 (file)
@@ -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:
index 9bf605db6c02ecd75592383a045eb14d0bee68a5..954abced96f980cd1fc5acb3e733b172e74c5665 100644 (file)
@@ -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)
 
index 89e27a3313d4b979f72619150bbce2545bbaf06f..a0a80ace4da973e103133ec14c6dc8030789f93c 100644 (file)
@@ -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,
index 27947532bf502e4ca30480f56e1ba3a3093a6a94..36eb8ac2127d4408ff164c28e3139b3be365dfb9 100644 (file)
@@ -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)