Atom.violated_conditionals: Always treat deps as violated if the flag is not in IUSE
authorSebastian Luther <SebastianLuther@gmx.de>
Tue, 24 Aug 2010 10:00:22 +0000 (12:00 +0200)
committerZac Medico <zmedico@gentoo.org>
Tue, 24 Aug 2010 13:48:40 +0000 (06:48 -0700)
pym/portage/dep/__init__.py
pym/portage/tests/dep/testAtom.py

index 7233305715d0d1b7b8fc422f508cddbc1170c833..cd0087ad7ef2be1345ba323ea79086fd56a349c4 100644 (file)
@@ -763,12 +763,35 @@ class _use_dep(object):
                conditional = {}
                tokens = []
 
+               all_defaults = frozenset(chain(self.missing_enabled, self.missing_disabled))
+               
+               def validate_flag(flag):
+                       return is_valid_flag(flag) or flag in all_defaults
+
+
                for x in self.tokens:
                        m = _useflag_re.match(x)
 
                        operator = m.group("prefix") + m.group("suffix")
                        flag = m.group("flag")
 
+                       if not validate_flag(flag):
+                               tokens.append(x)
+                               if not operator:
+                                       enabled_flags.add(flag)
+                               elif operator == "-":
+                                       disabled_flags.add(flag)
+                               elif operator == "?":
+                                       conditional.setdefault("enabled", set()).add(flag)
+                               elif operator == "=":
+                                       conditional.setdefault("equal", set()).add(flag)
+                               elif operator == "!=":
+                                       conditional.setdefault("not_equal", set()).add(flag)
+                               elif operator == "!?":
+                                       conditional.setdefault("disabled", set()).add(flag)
+
+                               continue
+
                        if not operator:
                                if flag not in other_use:
                                        if is_valid_flag(flag) or flag in self.missing_disabled:
index 4c504e0138e2011986ffab2df254eb8e17126f35..31999dc2c66197e020ebd8d95723c4dea363fe00 100644 (file)
@@ -190,6 +190,14 @@ class TestAtom(TestCase):
                        ("dev-libs/D[!x=]", [], ["x"], ["x"], "dev-libs/D"),
                        ("dev-libs/D[!x(+)=]", [], [], ["x"], "dev-libs/D[!x(+)=]"),
                        ("dev-libs/D[!x(-)=]", [], [], ["x"], "dev-libs/D"),
+
+                       #Missing IUSE test cases
+                       ("dev-libs/B[x]", [], [], [], "dev-libs/B[x]"),
+                       ("dev-libs/B[-x]", [], [], [], "dev-libs/B[-x]"),
+                       ("dev-libs/B[x?]", [], [], [], "dev-libs/B[x?]"),
+                       ("dev-libs/B[x=]", [], [], [], "dev-libs/B[x=]"),
+                       ("dev-libs/B[!x=]", [], [], ["x"], "dev-libs/B[!x=]"),
+                       ("dev-libs/B[!x?]", [], [], ["x"], "dev-libs/B[!x?]"),
                )
                
                test_cases_xfail = (