summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-12-20 11:17:41 +0000
committerZac Medico <zmedico@gentoo.org>2007-12-20 11:17:41 +0000
commitdb458e6f62d7d4c66562b824900c262e3015948d (patch)
tree87e4fd3981c42e5e04d829364150f917ed9a611e
parent0a0188d22823d494220af5a65d37ce0003a78145 (diff)
downloadportage-db458e6f62d7d4c66562b824900c262e3015948d.tar.gz
portage-db458e6f62d7d4c66562b824900c262e3015948d.tar.bz2
portage-db458e6f62d7d4c66562b824900c262e3015948d.zip
Bug #149816 - Implement visibility filtering for binary packages.
This is only the least invasive part of the implementation that is currently in trunk. svn path=/main/branches/2.1.2/; revision=8984
-rwxr-xr-xbin/emerge35
-rw-r--r--pym/portage.py4
2 files changed, 27 insertions, 12 deletions
diff --git a/bin/emerge b/bin/emerge
index 3759de185..3240d79ab 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -1045,6 +1045,29 @@ def perform_global_updates(mycpv, mydb, mycommands):
if updates:
mydb.aux_update(mycpv, updates)
+def visible(pkgsettings, cpv, metadata, built=False, installed=False):
+ """
+ Check if a package is visible. This can raise an InvalidDependString
+ exception if LICENSE is invalid.
+ TODO: optionally generate a list of masking reasons
+ @rtype: Boolean
+ @returns: True if the package is visible, False otherwise.
+ """
+ if not metadata["SLOT"]:
+ return False
+ if built and not installed and \
+ metadata["CHOST"] != pkgsettings["CHOST"]:
+ return False
+ if not portage.eapi_is_supported(metadata["EAPI"]):
+ return False
+ if pkgsettings._getMissingKeywords(cpv, metadata):
+ return False
+ if pkgsettings._getMaskAtom(cpv, metadata):
+ return False
+ if pkgsettings._getProfileMaskAtom(cpv, metadata):
+ return False
+ return True
+
class BlockerCache(DictMixin):
"""This caches blockers of installed packages so that dep_check does not
have to be done for every single installed package on every invocation of
@@ -1975,17 +1998,7 @@ class depgraph:
for pkg in bindb.match(x):
metadata = dict(izip(bindb_keys,
bindb.aux_get(pkg, bindb_keys)))
- if not metadata["SLOT"]:
- continue
- if chost != metadata["CHOST"]:
- continue
- if not portage.eapi_is_supported(metadata["EAPI"]):
- continue
- # Remove any binary package entries that are
- # masked in the portage tree (#55871).
- if not usepkgonly and \
- not (pkg in myeb_matches or \
- not portdb.cpv_exists(pkg)):
+ if not visible(pkgsettings, pkg, metadata, built=True):
continue
myeb_pkg_matches.append(pkg)
if myeb_pkg_matches:
diff --git a/pym/portage.py b/pym/portage.py
index 6195e6843..bf6016579 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -6002,7 +6002,9 @@ class bindbapi(fakedbapi):
self.settings = settings
self._match_cache = {}
# Selectively cache metadata in order to optimize dep matching.
- self._aux_cache_keys = set(["CHOST","EAPI","SLOT"])
+ self._aux_cache_keys = set(
+ ["CHOST", "EAPI", "IUSE", "KEYWORDS",
+ "LICENSE", "PROVIDE", "SLOT", "USE"])
self._aux_cache = {}
def match(self, *pargs, **kwargs):