]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
tinfoil: pass datastore to server when expanding python references
authorPaul Eggleton <paul.eggleton@linux.intel.com>
Tue, 13 Dec 2016 07:07:09 +0000 (20:07 +1300)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 14 Dec 2016 09:54:48 +0000 (09:54 +0000)
If you're expanding a value that refers to the value of a variable in
python code, we need to ensure that the datastore that gets used to get
the value of that variable is the client-side datastore and not just the
part of it that's on the server side. For example, suppose you are in
client code doing the following:

d.setVar('HELLO', 'there')
result = d.expand('${@d.getVar("HELLO", True)}')

result should be "there" but if the client part wasn't taken into
account, it would be whatever value HELLO had in the server portion of
the datastore (if any).

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
lib/bb/command.py
lib/bb/data_smart.py
lib/bb/tests/data.py
lib/bb/tinfoil.py

index b296b8ce84d8bdfb5c64ec8195e3fb58aa403efa..352838b0aa83f359e859784b942c080e392799a6 100644 (file)
@@ -483,14 +483,13 @@ class CommandsSync:
     dataStoreConnectorGetVarHistory.readonly = True
 
     def dataStoreConnectorExpandPythonRef(self, command, params):
-        dsindex = params[0]
+        config_data_dict = params[0]
         varname = params[1]
         expr = params[2]
-        if dsindex:
-            datastore = self.dataStores[dsindex]
-        else:
-            datastore = command.cooker.data
-        varparse = bb.data_smart.VariableParse(varname, datastore)
+
+        config_data = command.remotedatastores.receive_datastore(config_data_dict)
+
+        varparse = bb.data_smart.VariableParse(varname, config_data)
         return varparse.python_sub(expr)
 
     def dataStoreConnectorRelease(self, command, params):
index 5d0ed12d6e8b346aeee6b1462c393459afe18054..4d0a771283cb0021c6295df3d07714d220c10a54 100644 (file)
@@ -123,7 +123,7 @@ class VariableParse:
 
             if "_remote_data" in self.d:
                 connector = self.d["_remote_data"]
-                return connector.expandPythonRef(self.varname, code)
+                return connector.expandPythonRef(self.varname, code, self.d)
 
             codeobj = compile(code.strip(), self.varname or "<expansion>", "eval")
 
index 2bd481b5d7c2a8249f5f8577f2edd000fd2578f0..a17245f90afa75e9118f1a501567bec7ba662295 100644 (file)
@@ -458,8 +458,11 @@ class Remote(unittest.TestCase):
                 return self.d.localkeys()
             def getVarHistory(self, name):
                 return self.d.varhistory.variable(name)
-            def expandPythonRef(self, varname, expr):
-                varparse = bb.data_smart.VariableParse(varname, self.d)
+            def expandPythonRef(self, varname, expr, d):
+                localdata = self.d.createCopy()
+                for key in d.localkeys():
+                    localdata.setVar(d.getVar(key))
+                varparse = bb.data_smart.VariableParse(varname, localdata)
                 return varparse.python_sub(expr)
             def setVar(self, name, value):
                 self.d.setVar(name, value)
@@ -483,3 +486,6 @@ class Remote(unittest.TestCase):
         # Test setVar on client side affects server
         d2.setVar('HELLO', 'other-world')
         self.assertEqual(d1.getVar('HELLO'), 'other-world')
+        # Test client side data is incorporated in python expansion (which is done on server)
+        d2.setVar('FOO', 'bar')
+        self.assertEqual(d2.expand('${@d.getVar("FOO")}'), 'bar')
index c551a9f1f794f70c015b2fbc3ef784daf7eed2fb..720bf4b9313328d6efc97d26d07742fa222db9b4 100644 (file)
@@ -29,6 +29,7 @@ import bb.providers
 import bb.taskdata
 import bb.utils
 import bb.command
+import bb.remotedata
 from bb.cookerdata import CookerConfiguration, ConfigParameters
 from bb.main import setup_bitbake, BitBakeConfigParameters, BBMainException
 import bb.fetch2
@@ -69,8 +70,9 @@ class TinfoilDataStoreConnector:
         return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex))
     def getVarHistory(self, name):
         return self.tinfoil.run_command('dataStoreConnectorGetVarHistory', self.dsindex, name)
-    def expandPythonRef(self, varname, expr):
-        ret = self.tinfoil.run_command('dataStoreConnectorExpandPythonRef', self.dsindex, varname, expr)
+    def expandPythonRef(self, varname, expr, d):
+        ds = bb.remotedata.RemoteDatastores.transmit_datastore(d)
+        ret = self.tinfoil.run_command('dataStoreConnectorExpandPythonRef', ds, varname, expr)
         return ret
     def setVar(self, varname, value):
         if self.dsindex is None: