[gnome-continuous-yocto/gnomeostree-3.28-rocko: 5250/8267] bitbake: tinfoil: fix override handling in remote datastores
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-continuous-yocto/gnomeostree-3.28-rocko: 5250/8267] bitbake: tinfoil: fix override handling in remote datastores
- Date: Sun, 17 Dec 2017 03:10:33 +0000 (UTC)
commit 99414bdb1c64f7f03e12c347cc16c43c2fa336b2
Author: Paul Eggleton <paul eggleton linux intel com>
Date: Mon Mar 20 17:05:52 2017 +1300
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>
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 db20f3f..222a76e 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 4d56081..5777d54 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 895489e..da3f4e6 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 940f9ab..00cec59 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):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]