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 <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
0cb6f85335
commit
99414bdb1c
|
@ -457,16 +457,22 @@ class CommandsSync:
|
||||||
dsindex = params[0]
|
dsindex = params[0]
|
||||||
name = params[1]
|
name = params[1]
|
||||||
datastore = command.remotedatastores[dsindex]
|
datastore = command.remotedatastores[dsindex]
|
||||||
value = datastore._findVar(name)
|
value, overridedata = datastore._findVar(name)
|
||||||
|
|
||||||
if value:
|
if value:
|
||||||
content = value.get('_content', None)
|
content = value.get('_content', None)
|
||||||
if isinstance(content, bb.data_smart.DataSmart):
|
if isinstance(content, bb.data_smart.DataSmart):
|
||||||
# Value is a datastore (e.g. BB_ORIGENV) - need to handle this carefully
|
# Value is a datastore (e.g. BB_ORIGENV) - need to handle this carefully
|
||||||
idx = command.remotedatastores.check_store(content, True)
|
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):
|
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
|
return value
|
||||||
dataStoreConnectorFindVar.readonly = True
|
dataStoreConnectorFindVar.readonly = True
|
||||||
|
|
||||||
|
|
|
@ -473,7 +473,7 @@ class DataSmart(MutableMapping):
|
||||||
dest = self.dict
|
dest = self.dict
|
||||||
while dest:
|
while dest:
|
||||||
if var in dest:
|
if var in dest:
|
||||||
return dest[var]
|
return dest[var], self.overridedata.get(var, None)
|
||||||
|
|
||||||
if "_remote_data" in dest:
|
if "_remote_data" in dest:
|
||||||
connector = dest["_remote_data"]["_content"]
|
connector = dest["_remote_data"]["_content"]
|
||||||
|
@ -482,12 +482,13 @@ class DataSmart(MutableMapping):
|
||||||
if "_data" not in dest:
|
if "_data" not in dest:
|
||||||
break
|
break
|
||||||
dest = dest["_data"]
|
dest = dest["_data"]
|
||||||
|
return None, self.overridedata.get(var, None)
|
||||||
|
|
||||||
def _makeShadowCopy(self, var):
|
def _makeShadowCopy(self, var):
|
||||||
if var in self.dict:
|
if var in self.dict:
|
||||||
return
|
return
|
||||||
|
|
||||||
local_var = self._findVar(var)
|
local_var, _ = self._findVar(var)
|
||||||
|
|
||||||
if local_var:
|
if local_var:
|
||||||
self.dict[var] = copy.copy(local_var)
|
self.dict[var] = copy.copy(local_var)
|
||||||
|
@ -699,13 +700,13 @@ class DataSmart(MutableMapping):
|
||||||
self.dict["__exportlist"]["_content"].add(var)
|
self.dict["__exportlist"]["_content"].add(var)
|
||||||
|
|
||||||
def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False):
|
def getVarFlag(self, var, flag, expand=True, noweakdefault=False, parsing=False):
|
||||||
local_var = self._findVar(var)
|
local_var, overridedata = self._findVar(var)
|
||||||
value = None
|
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
|
match = False
|
||||||
active = {}
|
active = {}
|
||||||
self.need_overrides()
|
self.need_overrides()
|
||||||
for (r, o) in self.overridedata[var]:
|
for (r, o) in overridedata:
|
||||||
# What about double overrides both with "_" in the name?
|
# What about double overrides both with "_" in the name?
|
||||||
if o in self.overridesset:
|
if o in self.overridesset:
|
||||||
active[o] = r
|
active[o] = r
|
||||||
|
@ -796,7 +797,7 @@ class DataSmart(MutableMapping):
|
||||||
|
|
||||||
def delVarFlag(self, var, flag, **loginfo):
|
def delVarFlag(self, var, flag, **loginfo):
|
||||||
self.expand_cache = {}
|
self.expand_cache = {}
|
||||||
local_var = self._findVar(var)
|
local_var, _ = self._findVar(var)
|
||||||
if not local_var:
|
if not local_var:
|
||||||
return
|
return
|
||||||
if not var in self.dict:
|
if not var in self.dict:
|
||||||
|
@ -839,7 +840,7 @@ class DataSmart(MutableMapping):
|
||||||
self.dict[var][i] = flags[i]
|
self.dict[var][i] = flags[i]
|
||||||
|
|
||||||
def getVarFlags(self, var, expand = False, internalflags=False):
|
def getVarFlags(self, var, expand = False, internalflags=False):
|
||||||
local_var = self._findVar(var)
|
local_var, _ = self._findVar(var)
|
||||||
flags = {}
|
flags = {}
|
||||||
|
|
||||||
if local_var:
|
if local_var:
|
||||||
|
|
|
@ -503,3 +503,7 @@ class Remote(unittest.TestCase):
|
||||||
# Test client side data is incorporated in python expansion (which is done on server)
|
# Test client side data is incorporated in python expansion (which is done on server)
|
||||||
d2.setVar('FOO', 'bar')
|
d2.setVar('FOO', 'bar')
|
||||||
self.assertEqual(d2.expand('${@d.getVar("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')
|
||||||
|
|
|
@ -60,12 +60,15 @@ class TinfoilDataStoreConnector:
|
||||||
self.dsindex = dsindex
|
self.dsindex = dsindex
|
||||||
def getVar(self, name):
|
def getVar(self, name):
|
||||||
value = self.tinfoil.run_command('dataStoreConnectorFindVar', self.dsindex, name)
|
value = self.tinfoil.run_command('dataStoreConnectorFindVar', self.dsindex, name)
|
||||||
|
overrides = None
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
if '_connector_origtype' in value:
|
if '_connector_origtype' in value:
|
||||||
value['_content'] = self.tinfoil._reconvert_type(value['_content'], value['_connector_origtype'])
|
value['_content'] = self.tinfoil._reconvert_type(value['_content'], value['_connector_origtype'])
|
||||||
del value['_connector_origtype']
|
del value['_connector_origtype']
|
||||||
|
if '_connector_overrides' in value:
|
||||||
return value
|
overrides = value['_connector_overrides']
|
||||||
|
del value['_connector_overrides']
|
||||||
|
return value, overrides
|
||||||
def getKeys(self):
|
def getKeys(self):
|
||||||
return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex))
|
return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex))
|
||||||
def getVarHistory(self, name):
|
def getVarHistory(self, name):
|
||||||
|
|
Loading…
Reference in New Issue