Generate a pruned version of ACCEPT_LICENSE, by intersection with
authorZac Medico <zmedico@gentoo.org>
Thu, 30 Apr 2009 07:31:39 +0000 (07:31 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 30 Apr 2009 07:31:39 +0000 (07:31 -0000)
LICENSE. This is required since otherwise ACCEPT_LICENSE might be too
big (bigger than ARG_MAX), causing execve() calls to fail with E2BIG
errors as in bug #262647. (trunk r13417)

svn path=/main/branches/2.1.6/; revision=13557

pym/portage/__init__.py

index 3fe6f1ca044fe5cb202dd870a12dec75f53b6372..785498e759f0b1a473e14a287d341c8165adc0ee 100644 (file)
@@ -2063,6 +2063,31 @@ class config(object):
                        DeprecationWarning)
                return 1
 
+       class _lazy_accept_license(object):
+               """
+               Generate a pruned version of ACCEPT_LICENSE, by intersection with
+               LICENSE. This is required since otherwise ACCEPT_LICENSE might be too
+               big (bigger than ARG_MAX), causing execve() calls to fail with E2BIG
+               errors as in bug #262647.
+               """
+               __slots__ = ('settings',)
+
+               def __init__(self, settings):
+                       self.settings = settings
+
+               def __call__(self):
+                       settings = self.settings
+                       try:
+                               licenses = set(flatten(
+                                       dep.use_reduce(dep.paren_reduce(
+                                       settings['LICENSE']),
+                                       uselist=settings['PORTAGE_USE'].split())))
+                       except exception.InvalidDependString:
+                               licenses = set()
+                       if '*' not in settings._accept_license:
+                               licenses.intersection_update(settings._accept_license)
+                       return ' '.join(sorted(licenses))
+
        class _lazy_use_expand(object):
                """
                Lazily evaluate USE_EXPAND variables since they are only needed when
@@ -2278,6 +2303,9 @@ class config(object):
                if has_changed:
                        self.reset(keeping_pkg=1,use_cache=use_cache)
 
+               env_configdict.addLazySingleton('ACCEPT_LICENSE',
+                       self._lazy_accept_license(self))
+
                # If reset() has not been called, it's safe to return
                # early if IUSE has not changed.
                if not has_changed and previous_iuse == iuse: