From 99414bdb1c64f7f03e12c347cc16c43c2fa336b2 Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Mon, 20 Mar 2017 17:05:52 +1300 Subject: bitbake: tinfoil: fix override handling in remote datastores There was a huge gap in the remote datastore code introduced in the tinfoil2 rework - we weren't handling overrides at all, since these are stored separately from the actual data in the DataSmart object. Thus, when a datastore actually represents a remote datastore we need to go back to that remote datastore to get the override data as well, so introduce code to do that. To avoid a second round-trip I had to modify the _findVar() function to return the override data as well. This will increase the overhead a little when that data is superfluous, but without making the function even uglier I don't think there's a way to avoid that. (Bitbake rev: 4f9d6f060ed247fb6fa2f45668a892a1788d3f91) Signed-off-by: Paul Eggleton Signed-off-by: Richard Purdie --- bitbake/lib/bb/command.py | 12 +++++++++--- bitbake/lib/bb/data_smart.py | 15 ++++++++------- bitbake/lib/bb/tests/data.py | 4 ++++ bitbake/lib/bb/tinfoil.py | 7 +++++-- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py index db20f3ffad..222a76e580 100644 --- a/bitbake/lib/bb/command.py +++ b/bitbake/lib/bb/command.py @@ -457,16 +457,22 @@ class CommandsSync: dsindex = params[0] name = params[1] datastore = command.remotedatastores[dsindex] - value = datastore._findVar(name) + value, overridedata = datastore._findVar(name) if value: content = value.get('_content', None) if isinstance(content, bb.data_smart.DataSmart): # Value is a datastore (e.g. BB_ORIGENV) - need to handle this carefully idx = command.remotedatastores.check_store(content, True) - return {'_content': DataStoreConnectionHandle(idx), '_connector_origtype': 'DataStoreConnectionHandle'} + return {'_content': DataStoreConnectionHandle(idx), + '_connector_origtype': 'DataStoreConnectionHandle', + '_connector_overrides': overridedata} elif isinstance(content, set): - return {'_content': list(content), '_connector_origtype': 'set'} + return {'_content': list(content), + '_connector_origtype': 'set', + '_connector_overrides': overridedata} + else: + value['_connector_overrides'] = overridedata return value dataStoreConnectorFindVar.readonly = True diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index 4d56081b66..5777d545a8 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -473,7 +473,7 @@ class DataSmart(MutableMapping): dest = self.dict while dest: if var in dest: - return dest[var] + return dest[var], self.overridedata.get(var, None) if "_remote_data" in dest: connector = dest["_remote_data"]["_content"] @@ -482,12 +482,13 @@ class DataSmart(MutableMapping): if "_data" not in dest: break dest = dest["_data"] + return None, self.overridedata.get(var, None) def _makeShadowCopy(self, var): if var in self.dict: return - local_var = self._findVar(var) + local_var, _ = self._findVar(var) if local_var: self.dict[var] = copy.copy(local_var) @@ -699,13 +700,13 @@ class DataSmart(MutableMapping): self.dict["__exportlist"]["_content"].add(var) def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False): - local_var = self._findVar(var) + local_var, overridedata = self._findVar(var) value = None - if flag == "_content" and var in self.overridedata and not parsing: + if flag == "_content" and overridedata is not None and not parsing: match = False active = {} self.need_overrides() - for (r, o) in self.overridedata[var]: + for (r, o) in overridedata: # What about double overrides both with "_" in the name? if o in self.overridesset: active[o] = r @@ -796,7 +797,7 @@ class DataSmart(MutableMapping): def delVarFlag(self, var, flag, **loginfo): self.expand_cache = {} - local_var = self._findVar(var) + local_var, _ = self._findVar(var) if not local_var: return if not var in self.dict: @@ -839,7 +840,7 @@ class DataSmart(MutableMapping): self.dict[var][i] = flags[i] def getVarFlags(self, var, expand = False, internalflags=False): - local_var = self._findVar(var) + local_var, _ = self._findVar(var) flags = {} if local_var: diff --git a/bitbake/lib/bb/tests/data.py b/bitbake/lib/bb/tests/data.py index 895489e02a..da3f4e66f8 100644 --- a/bitbake/lib/bb/tests/data.py +++ b/bitbake/lib/bb/tests/data.py @@ -503,3 +503,7 @@ class Remote(unittest.TestCase): # 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') + # Test overrides work + d1.setVar('FOO_test', 'baz') + d1.appendVar('OVERRIDES', ':test') + self.assertEqual(d2.getVar('FOO'), 'baz') diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py index 940f9ab0d5..00cec59b83 100644 --- a/bitbake/lib/bb/tinfoil.py +++ b/bitbake/lib/bb/tinfoil.py @@ -60,12 +60,15 @@ class TinfoilDataStoreConnector: self.dsindex = dsindex def getVar(self, name): value = self.tinfoil.run_command('dataStoreConnectorFindVar', self.dsindex, name) + overrides = None if isinstance(value, dict): if '_connector_origtype' in value: value['_content'] = self.tinfoil._reconvert_type(value['_content'], value['_connector_origtype']) del value['_connector_origtype'] - - return value + if '_connector_overrides' in value: + overrides = value['_connector_overrides'] + del value['_connector_overrides'] + return value, overrides def getKeys(self): return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex)) def getVarHistory(self, name): -- cgit v1.2.3-54-g00ecf