Add support for and ACCEPT_CHOSTS variable that controls masking behavior
authorZac Medico <zmedico@gentoo.org>
Sun, 15 Jun 2008 04:38:15 +0000 (04:38 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 15 Jun 2008 04:38:15 +0000 (04:38 -0000)
for binary packages wrt CHOST.  The variable is a space separated list of
chosts. It support regular expressions, so if the actual chost contains
any special characters then the user must escape them when setting
ACCEPT_CHOSTS.

svn path=/main/trunk/; revision=10654

pym/_emerge/__init__.py
pym/portage/__init__.py

index 97bd9604c4e8640e7570f79324998bc0bb953fe6..fef25c3f044397179e1c12c1698f583c781ce4f6 100644 (file)
@@ -1114,9 +1114,8 @@ def visible(pkgsettings, pkg):
        """
        if not pkg.metadata["SLOT"]:
                return False
-       if pkg.built and not pkg.installed:
-               pkg_chost = pkg.metadata.get("CHOST")
-               if pkg_chost and pkg_chost != pkgsettings["CHOST"]:
+       if pkg.built and not pkg.installed and "CHOST" in pkg.metadata:
+               if not pkgsettings._accept_chost(pkg):
                        return False
        if not portage.eapi_is_supported(pkg.metadata["EAPI"]):
                return False
@@ -1140,9 +1139,8 @@ def get_masking_status(pkg, pkgsettings, root_config):
                pkg, settings=pkgsettings,
                portdb=root_config.trees["porttree"].dbapi)
 
-       if pkg.built and not pkg.installed:
-               pkg_chost = pkg.metadata.get("CHOST")
-               if pkg_chost and pkg_chost != pkgsettings["CHOST"]:
+       if pkg.built and not pkg.installed and "CHOST" in pkg.metadata:
+               if not pkgsettings._accept_chost(pkg):
                        mreasons.append("CHOST: %s" % \
                                pkg.metadata["CHOST"])
 
index 0ca4f2441926455e8a4c27a92da894e7302d04a2..5eccf3a7f5cf0fee807c7c5b83ae30c8257b28b4 100644 (file)
@@ -998,6 +998,7 @@ class config(object):
        ]
 
        _environ_filter = frozenset(_environ_filter)
+       _accept_chost_re = None
 
        def __init__(self, clone=None, mycpv=None, config_profile_path=None,
                config_incrementals=None, config_root=None, target_root=None,
@@ -2381,6 +2382,26 @@ class config(object):
                                        ret.append(element)
                return ret
 
+       def _accept_chost(self, pkg):
+               """
+               @return True if pkg CHOST is accepted, False otherwise.
+               """
+               if self._accept_chost_re is None:
+                       accept_chost = self.get("ACCEPT_CHOSTS", "").split()
+                       if not accept_chost:
+                               chost = self.get("CHOST")
+                               if chost:
+                                       accept_chost.append(chost)
+                       if not accept_chost:
+                               self._accept_chost_re = re.compile(".*")
+                       elif len(accept_chost) == 1:
+                               self._accept_chost_re = re.compile(accept_chost[0])
+                       else:
+                               self._accept_chost_re = re.compile(
+                                       r'^(%s)$' % "|".join(accept_chost))
+               return self._accept_chost_re.match(
+                       pkg.metadata.get("CHOST", "")) is not None
+
        def setinst(self,mycpv,mydbapi):
                """This updates the preferences for old-style virtuals,
                affecting the behavior of dep_expand() and dep_check()