[bitbake-devel] [PATCH] data_smart: Fix removal handling interaction issue with overrides

Richard Purdie richard.purdie at linuxfoundation.org
Fri Oct 19 11:27:38 UTC 2018


If a variable has a _remove applied to it but that variable is in turn
'renamed' through OVERRIDES, the removal gets lost with the current code.

TEST = "foo"
TEST_someval = "bar"
TEST_someval_remove = "bar"
OVERRIDES = "someval"

currently gives "bar" for TEST but should give "".

This fixes the code to track the removal and adds a test case to ensure this
doesn't regress again.

Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 lib/bb/data_smart.py | 17 +++++++++++++----
 lib/bb/tests/data.py |  9 +++++++++
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/lib/bb/data_smart.py b/lib/bb/data_smart.py
index 8c4c6a9a32..6b94fc4b42 100644
--- a/lib/bb/data_smart.py
+++ b/lib/bb/data_smart.py
@@ -736,6 +736,7 @@ class DataSmart(MutableMapping):
 
         local_var, overridedata = self._findVar(var)
         value = None
+        removes = set()
         if flag == "_content" and overridedata is not None and not parsing:
             match = False
             active = {}
@@ -762,7 +763,11 @@ class DataSmart(MutableMapping):
                             match = active[a]
                             del active[a]
             if match:
-                value = self.getVar(match, False)
+                value, subparser = self.getVarFlag(match, "_content", False, retparser=True)
+                if hasattr(subparser, "removes"):
+                    # We have to carry the removes from the overridden variable to apply at the
+                    # end of processing
+                    removes = subparser.removes
 
         if local_var is not None and value is None:
             if flag in local_var:
@@ -805,7 +810,6 @@ class DataSmart(MutableMapping):
             value = parser.value
 
         if value and flag == "_content" and local_var is not None and "_remove" in local_var and not parsing:
-            removes = {}
             self.need_overrides()
             for (r, o) in local_var["_remove"]:
                 match = True
@@ -814,15 +818,20 @@ class DataSmart(MutableMapping):
                         if not o2 in self.overrides:
                             match = False                            
                 if match:
-                    removes[r] = self.expand(r).split()
+                    removes.add(r)
 
+        if value and flag == "_content" and not parsing:
             if removes and parser:
+                expanded_removes = {}
+                for r in removes:
+                    expanded_removes[r] = self.expand(r).split()
+
                 parser.removes = set()
                 val = ""
                 for v in __whitespace_split__.split(parser.value):
                     skip = False
                     for r in removes:
-                        if v in removes[r]:
+                        if v in expanded_removes[r]:
                             parser.removes.add(r)
                             skip = True
                     if skip:
diff --git a/lib/bb/tests/data.py b/lib/bb/tests/data.py
index 9ac78e3683..db3e2010a9 100644
--- a/lib/bb/tests/data.py
+++ b/lib/bb/tests/data.py
@@ -386,6 +386,15 @@ class TestOverrides(unittest.TestCase):
         self.d.setVar("OVERRIDES", "foo:bar:some_val")
         self.assertEqual(self.d.getVar("TEST"), "testvalue3")
 
+    def test_remove_with_override(self):
+        self.d.setVar("TEST_bar", "testvalue2")
+        self.d.setVar("TEST_some_val", "testvalue3 testvalue5")
+        self.d.setVar("TEST_some_val_remove", "testvalue3")
+        self.d.setVar("TEST_foo", "testvalue4")
+        self.d.setVar("OVERRIDES", "foo:bar:some_val")
+        self.assertEqual(self.d.getVar("TEST"), " testvalue5")
+
+
 class TestKeyExpansion(unittest.TestCase):
     def setUp(self):
         self.d = bb.data.init()
-- 
2.17.1




More information about the bitbake-devel mailing list