check_required_use: clarify operator logic
authorZac Medico <zmedico@gentoo.org>
Fri, 4 Feb 2011 22:31:32 +0000 (14:31 -0800)
committerZac Medico <zmedico@gentoo.org>
Fri, 4 Feb 2011 22:31:32 +0000 (14:31 -0800)
pym/portage/dep/__init__.py
pym/portage/tests/dep/testCheckRequiredUse.py

index b27d589561ccf29c39891f16d1f0f719cdfb5a6c..b429e5617b7b45a0e6dbd10ae3b81557161ee498 100644 (file)
@@ -2187,10 +2187,9 @@ def check_required_use(required_use, use, iuse_match):
                        if level > 0:
                                level -= 1
                                l = stack.pop()
-                               ignore = False
+                               op = None
                                if stack[level]:
                                        if stack[level][-1] in ("||", "^^"):
-                                               ignore = True
                                                op = stack[level].pop()
                                                satisfied = is_satisfied(op, l)
                                                stack[level].append(satisfied)
@@ -2198,13 +2197,12 @@ def check_required_use(required_use, use, iuse_match):
 
                                        elif not isinstance(stack[level][-1], bool) and \
                                                stack[level][-1][-1] == "?":
-                                               if is_active(stack[level][-1][:-1]):
-                                                       op = stack[level].pop()
+                                               op = stack[level].pop()
+                                               if is_active(op[:-1]):
                                                        satisfied = is_satisfied(op, l)
                                                        stack[level].append(satisfied)
                                                        node._satisfied = satisfied
                                                else:
-                                                       stack[level].pop()
                                                        node._satisfied = True
                                                        last_node = node._parent._children.pop()
                                                        if last_node is not node:
@@ -2212,12 +2210,13 @@ def check_required_use(required_use, use, iuse_match):
                                                                        "node is not last child of parent")
                                                        node = node._parent
                                                        continue
-                                               ignore = True
 
-                               if l and not ignore:
+                               if op is None:
                                        satisfied = False not in l
-                                       stack[level].append(satisfied)
                                        node._satisfied = satisfied
+                                       if l:
+                                               stack[level].append(satisfied)
+
                                        if node._parent._operator not in ("||", "^^"):
                                                last_node = node._parent._children.pop()
                                                if last_node is not node:
index c5a8f530453522a2b92e6d7a7430e46713b288b2..a0e10b1e7325e5d4a1a7c8feb10c0cafd8d1a0c0 100644 (file)
@@ -195,6 +195,11 @@ class TestCheckRequiredUse(TestCase):
                                "|| ( ( ( ( a ) ) ( ( ( b c ) ) ) ) )",
                                [""],
                                "a b c"
+                       ),
+                       (
+                               "|| ( ( a ( ( ) ( ) ) ( ( ) ) ( b ( ) c ) ) )",
+                               [""],
+                               "a b c"
                        )
                )
                for required_use, use, expected in test_cases: