FakeVartree: use live meta if installed EAPI ok
authorZac Medico <zmedico@gentoo.org>
Thu, 26 May 2011 01:04:33 +0000 (18:04 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 26 May 2011 06:12:38 +0000 (23:12 -0700)
This will fix bug #368725.

pym/_emerge/FakeVartree.py

index 61dd54061893eb261f77c4616a4e999150047d3e..4bc6261ec5ec4af754865e994994b1001990791b 100644 (file)
@@ -85,11 +85,23 @@ class FakeVartree(vartree):
                if pkg in self._aux_get_history:
                        return self._aux_get(pkg, wants)
                self._aux_get_history.add(pkg)
+               # We need to check the EAPI, and this also raises
+               # a KeyError to the caller if appropriate.
+               installed_eapi, repo = self._aux_get(pkg, ["EAPI", "repository"])
                try:
                        # Use the live ebuild metadata if possible.
                        live_metadata = dict(zip(self._portdb_keys,
                                self._portdb.aux_get(pkg, self._portdb_keys)))
-                       if not portage.eapi_is_supported(live_metadata["EAPI"]):
+                       # Use the metadata from the installed instance if the EAPI
+                       # of either instance is unsupported, since if the installed
+                       # instance has an unsupported or corrupt EAPI then we don't
+                       # want to attempt to do complex operations such as execute
+                       # pkg_config, pkg_prerm or pkg_postrm phases. If both EAPIs
+                       # are supported then go ahead and use the live_metadata, in
+                       # order to respect dep updates without revision bump or EAPI
+                       # bump, as in bug #368725.
+                       if not (portage.eapi_is_supported(live_metadata["EAPI"]) and \
+                               portage.eapi_is_supported(installed_eapi)):
                                raise KeyError(pkg)
                        self.dbapi.aux_update(pkg, live_metadata)
                except (KeyError, portage.exception.PortageException):