commit:     46fac6698e5c73fda964819b508f1fe9dd341393
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Aug 12 17:16:46 2017 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Aug 12 23:48:14 2017 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=46fac669

emerge: add --autounmask-keep-keywords option (bug 622480)

The option prevents --autounmask from making changes to
package.accept_keywords. This option does not imply
--autounmask-keep-masks, so --autounmask is still allowed
to create package.unmask changes unless the
--autounmask-keep-masks is also specified.

X-Gentoo-bug: 622480
X-Gentoo-bug-url: https://bugs.gentoo.org/622480
Reviewed-by: Manuel RĂ¼ger <mrueg <AT> gentoo.org>

 man/emerge.1                                       |  7 +++
 pym/_emerge/depgraph.py                            | 12 ++--
 pym/_emerge/main.py                                |  9 +++
 .../resolver/test_autounmask_keep_keywords.py      | 72 ++++++++++++++++++++++
 4 files changed, 96 insertions(+), 4 deletions(-)

diff --git a/man/emerge.1 b/man/emerge.1
index ffb453efb..12a0db166 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -395,6 +395,13 @@ using the \'=\' operator will be written. With this
 option, \'>=\' operators will be used whenever possible.
 USE and license changes always use the latter behavior.
 .TP
+.BR "\-\-autounmask\-keep\-keywords [ y | n ]"
+If \-\-autounmask is enabled, no package.accept_keywords changes will
+be created. This leads to unsatisfied dependencies if any keyword
+changes are required. This option does not imply \-\-autounmask\-keep\-masks,
+so \-\-autounmask is still allowed to create package.unmask changes unless
+the \-\-autounmask\-keep\-masks is also specified.
+.TP
 .BR "\-\-autounmask\-keep\-masks [ y | n ]"
 If \-\-autounmask is enabled, no package.unmask or ** keyword changes
 will be created. This leads to unsatisfied dependencies if

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index abe2cb1bd..b4fc5f297 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -5707,6 +5707,7 @@ class depgraph(object):
                if self._dynamic_config._autounmask is not True:
                        return
 
+               autounmask_keep_keywords = 
self._frozen_config.myopts.get("--autounmask-keep-keywords", "n") != "n"
                autounmask_keep_masks = 
self._frozen_config.myopts.get("--autounmask-keep-masks", "n") != "n"
                autounmask_level = self._AutounmaskLevel()
 
@@ -5716,14 +5717,16 @@ class depgraph(object):
                autounmask_level.allow_license_changes = True
                yield autounmask_level
 
-               autounmask_level.allow_unstable_keywords = True
-               yield autounmask_level
-
-               if not autounmask_keep_masks:
+               if not autounmask_keep_keywords:
+                       autounmask_level.allow_unstable_keywords = True
+                       yield autounmask_level
 
+               if not (autounmask_keep_keywords or autounmask_keep_masks):
+                       autounmask_level.allow_unstable_keywords = True
                        autounmask_level.allow_missing_keywords = True
                        yield autounmask_level
 
+               if not autounmask_keep_masks:
                        # 4. USE + license + masks
                        # Try to respect keywords while discarding
                        # package.mask (see bug #463394).
@@ -5732,6 +5735,7 @@ class depgraph(object):
                        autounmask_level.allow_unmasks = True
                        yield autounmask_level
 
+               if not (autounmask_keep_keywords or autounmask_keep_masks):
                        autounmask_level.allow_unstable_keywords = True
 
                        for missing_keyword, unmask in ((False, True), (True, 
True)):

diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index 2132aa63c..d3a415b91 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -129,6 +129,7 @@ def insert_optional_args(args):
                '--autounmask'           : y_or_n,
                '--autounmask-continue'  : y_or_n,
                '--autounmask-only'      : y_or_n,
+               '--autounmask-keep-keywords' : y_or_n,
                '--autounmask-keep-masks': y_or_n,
                '--autounmask-unrestricted-atoms' : y_or_n,
                '--autounmask-write'     : y_or_n,
@@ -348,6 +349,11 @@ def parse_opts(tmpcmdline, silent=False):
                        "choices" : true_y_or_n
                },
 
+               "--autounmask-keep-keywords": {
+                       "help"    : "don't add package.accept_keywords entries",
+                       "choices" : true_y_or_n
+               },
+
                "--autounmask-keep-masks": {
                        "help"    : "don't add package.unmask entries",
                        "choices" : true_y_or_n
@@ -797,6 +803,9 @@ def parse_opts(tmpcmdline, silent=False):
        if myoptions.autounmask_unrestricted_atoms in true_y:
                myoptions.autounmask_unrestricted_atoms = True
 
+       if myoptions.autounmask_keep_keywords in true_y:
+               myoptions.autounmask_keep_keywords = True
+
        if myoptions.autounmask_keep_masks in true_y:
                myoptions.autounmask_keep_masks = True
 

diff --git a/pym/portage/tests/resolver/test_autounmask_keep_keywords.py 
b/pym/portage/tests/resolver/test_autounmask_keep_keywords.py
new file mode 100644
index 000000000..79a4837a5
--- /dev/null
+++ b/pym/portage/tests/resolver/test_autounmask_keep_keywords.py
@@ -0,0 +1,72 @@
+# Copyright 2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import (
+       ResolverPlayground,
+       ResolverPlaygroundTestCase,
+)
+
+class AutounmaskKeepKeywordsTestCase(TestCase):
+
+       def testAutounmaskKeepKeywordsTestCase(self):
+               ebuilds = {
+                       'app-misc/A-2': {
+                               'EAPI': '6',
+                               'RDEPEND': 'app-misc/B',
+                       },
+                       'app-misc/A-1': {
+                               'EAPI': '6',
+                               'RDEPEND': 'app-misc/C[foo]',
+                       },
+                       'app-misc/B-1': {
+                               'EAPI': '6',
+                               'KEYWORDS': '~x86',
+                       },
+                       'app-misc/C-1': {
+                               'EAPI': '6',
+                               'IUSE': 'foo',
+                       },
+               }
+               installed = {
+               }
+
+               test_cases = (
+                       ResolverPlaygroundTestCase(
+                               ['app-misc/A'],
+                               success = False,
+                               options = {
+                                       '--autounmask-keep-keywords': 'n',
+                               },
+                               mergelist = [
+                                   'app-misc/B-1',
+                                   'app-misc/A-2',
+                               ],
+                               unstable_keywords={'app-misc/B-1'},
+                       ),
+                       # --autounmask-keep-keywords prefers app-misc/A-1 
because
+                       # it can be installed without accepting unstable
+                       # keywords
+                       ResolverPlaygroundTestCase(
+                               ['app-misc/A'],
+                               success = False,
+                               options = {
+                                       '--autounmask-keep-keywords': 'y',
+                               },
+                               mergelist = [
+                                   'app-misc/C-1',
+                                   'app-misc/A-1',
+                               ],
+                               use_changes = {'app-misc/C-1': {'foo': True}},
+                       ),
+               )
+
+               playground = ResolverPlayground(ebuilds=ebuilds, debug=False)
+               try:
+                       for test_case in test_cases:
+                               playground.run_TestCase(test_case)
+                               self.assertEqual(test_case.test_success,
+                                       True, test_case.fail_msg)
+               finally:
+                       playground.debug = False
+                       playground.cleanup()

Reply via email to