summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/__init__.py89
-rw-r--r--pym/portage/const.py2
2 files changed, 53 insertions, 38 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 95741829a..36e726d1e 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -1201,6 +1201,7 @@ class config(object):
self.modifiedkeys = []
self.uvlist = []
self._accept_chost_re = None
+ self._accept_license = None
self.virtuals = {}
self.virts_p = {}
@@ -1818,18 +1819,6 @@ class config(object):
self["PORTAGE_PYM_PATH"] = PORTAGE_PYM_PATH
self.backup_changes("PORTAGE_PYM_PATH")
- # Expand license groups
- # This has to do be done for each config layer before regenerate()
- # in order for incremental negation to work properly.
- if local_config:
- for c in self.configdict.itervalues():
- v = c.get("ACCEPT_LICENSE")
- if not v:
- continue
- v = " ".join(self.expandLicenseTokens(v.split()))
- c["ACCEPT_LICENSE"] = v
- del c, v
-
for var in ("PORTAGE_INST_UID", "PORTAGE_INST_GID"):
try:
self[var] = str(int(self.get(var, "0")))
@@ -1843,20 +1832,6 @@ class config(object):
# initialize self.features
self.regenerate()
- if local_config:
- self._accept_license = \
- set(self.get("ACCEPT_LICENSE", "").split())
- # In order to enforce explicit acceptance for restrictive
- # licenses that require it, "*" will not be allowed in the
- # user config. Don't enforce this until license groups are
- # fully implemented in the tree.
- #self._accept_license.discard("*")
- if not self._accept_license:
- self._accept_license = set(["*"])
- else:
- # repoman will accept any license
- self._accept_license = set(["*"])
-
if not portage.process.sandbox_capable and \
("sandbox" in self.features or "usersandbox" in self.features):
if self.profile_path is not None and \
@@ -2113,10 +2088,19 @@ class config(object):
except exception.InvalidDependString:
licenses = set()
licenses.discard('||')
- # Do not expand * here, since that would make it appear to the
- # check_license() function as if the user has accepted licenses
- # which have not really been explicitly accepted.
- licenses.intersection_update(settings._accept_license)
+ if settings._accept_license:
+ acceptable_licenses = set()
+ for x in settings._accept_license:
+ if x == '*':
+ acceptable_licenses.update(licenses)
+ elif x == '-*':
+ acceptable_licenses.clear()
+ elif x[:1] == '-':
+ acceptable_licenses.discard(x[1:])
+ else:
+ acceptable_licenses.add(x)
+
+ licenses = acceptable_licenses
return ' '.join(sorted(licenses))
def _restrict(self, use, settings):
@@ -2676,15 +2660,30 @@ class config(object):
@rtype: List
@return: A list of licenses that have not been accepted.
"""
- if "*" in self._accept_license:
+ if not self._accept_license:
return []
- acceptable_licenses = self._accept_license
+ accept_license = self._accept_license
cpdict = self._plicensedict.get(dep_getkey(cpv), None)
if cpdict:
- acceptable_licenses = self._accept_license.copy()
+ accept_license = list(self._accept_license)
cpv_slot = "%s:%s" % (cpv, metadata["SLOT"])
for atom in match_to_list(cpv_slot, cpdict.keys()):
- acceptable_licenses.update(cpdict[atom])
+ accept_license.extend(cpdict[atom])
+
+ licenses = set(flatten(dep.use_reduce(dep.paren_reduce(
+ metadata["LICENSE"]), matchall=1)))
+ licenses.discard('||')
+
+ acceptable_licenses = set()
+ for x in accept_license:
+ if x == '*':
+ acceptable_licenses.update(licenses)
+ elif x == '-*':
+ acceptable_licenses.clear()
+ elif x[:1] == '-':
+ acceptable_licenses.discard(x[1:])
+ else:
+ acceptable_licenses.add(x)
license_str = metadata["LICENSE"]
if "?" in license_str:
@@ -2854,10 +2853,26 @@ class config(object):
# an incremental!
myincrementals.remove("USE")
- for mykey in myincrementals:
- mydbs=self.configlist[:-1]
- mydbs.append(self.backupenv)
+ mydbs = self.configlist[:-1]
+ mydbs.append(self.backupenv)
+
+ # ACCEPT_LICENSE is a lazily evaluated incremental, so that * can be
+ # used to match all licenses without every having to explicitly expand
+ # it to all licenses.
+ if self._accept_license is None:
+ if self.local_config:
+ mysplit = []
+ for curdb in mydbs:
+ mysplit.extend(curdb.get('ACCEPT_LICENSE', '').split())
+ if mysplit:
+ self.configlist[-1]['ACCEPT_LICENSE'] = ' '.join(mysplit)
+ self._accept_license = tuple(self.expandLicenseTokens(mysplit))
+ else:
+ # repoman will accept any license
+ self._accept_license = ()
+
+ for mykey in myincrementals:
myflags=[]
for curdb in mydbs:
diff --git a/pym/portage/const.py b/pym/portage/const.py
index 84930cdc6..155279c05 100644
--- a/pym/portage/const.py
+++ b/pym/portage/const.py
@@ -52,7 +52,7 @@ REPO_NAME_FILE = "repo_name"
REPO_NAME_LOC = "profiles" + "/" + REPO_NAME_FILE
INCREMENTALS = ["USE", "USE_EXPAND", "USE_EXPAND_HIDDEN", "FEATURES",
- "ACCEPT_KEYWORDS", "ACCEPT_LICENSE",
+ "ACCEPT_KEYWORDS",
"CONFIG_PROTECT_MASK", "CONFIG_PROTECT",
"PRELINK_PATH", "PRELINK_PATH_MASK", "PROFILE_ONLY_VARIABLES"]
EBUILD_PHASES = ["setup", "unpack", "prepare", "configure",