diff options
author | Raoul Hidalgo Charman <raoul.hidalgocharman@codethink.co.uk> | 2019-05-02 16:01:13 +0100 |
---|---|---|
committer | Raoul Hidalgo Charman <raoul.hidalgocharman@codethink.co.uk> | 2019-05-10 16:09:20 +0100 |
commit | 7299f85e98b558edac216af5cd8c1ca2762041bd (patch) | |
tree | a8ceabaf9e3ee919bd9586b3af451f98298c8c45 /buildstream/source.py | |
parent | cc871d37500cc78d16112cf31bf32685c3b7e9aa (diff) | |
download | buildstream-raoul/1010-multiple-track-fix.tar.gz |
source.py: ensure previous track refs are updatedraoul/1010-multiple-track-fix
Updates the refs in the job process (but doesn't write), to ensure
following sources can see consistency of previous sourcse has been
updated. `_save_ref` is renamed `_set_ref` with writing to file now
optional.
This also changes the previous_source_access test to use a remote, so
that it actually tests this cornercase.
Fixes #1010
Diffstat (limited to 'buildstream/source.py')
-rw-r--r-- | buildstream/source.py | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/buildstream/source.py b/buildstream/source.py index 0c07dd41e..b1346eb1b 100644 --- a/buildstream/source.py +++ b/buildstream/source.py @@ -742,24 +742,6 @@ class Source(Plugin): return key - # Wrapper for set_ref(), also returns whether it changed. - # - def _set_ref(self, ref, node): - current_ref = self.get_ref() # pylint: disable=assignment-from-no-return - changed = False - - # This comparison should work even for tuples and lists, - # but we're mostly concerned about simple strings anyway. - if current_ref != ref: - changed = True - - # Set the ref regardless of whether it changed, the - # TrackQueue() will want to update a specific node with - # the ref, regardless of whether the original has changed. - self.set_ref(ref, node) - - return changed - # _project_refs(): # # Gets the appropriate ProjectRefs object for this source, @@ -836,7 +818,7 @@ class Source(Plugin): return redundant_ref - # _save_ref() + # _set_ref() # # Persists the ref for this source. This will decide where to save the # ref, or refuse to persist it, depending on active ref-storage project @@ -844,6 +826,7 @@ class Source(Plugin): # # Args: # new_ref (smth): The new reference to save + # save (bool): Whether to write the new reference to file or not # # Returns: # (bool): Whether the ref has changed @@ -851,7 +834,7 @@ class Source(Plugin): # Raises: # (SourceError): In the case we encounter errors saving a file to disk # - def _save_ref(self, new_ref): + def _set_ref(self, new_ref, *, save): context = self._get_context() project = self._get_project() @@ -891,7 +874,15 @@ class Source(Plugin): # clean = _yaml.node_sanitize(node, dict_type=dict) to_modify = _yaml.node_sanitize(node, dict_type=dict) - if not self._set_ref(new_ref, to_modify): + + current_ref = self.get_ref() # pylint: disable=assignment-from-no-return + + # Set the ref regardless of whether it changed, the + # TrackQueue() will want to update a specific node with + # the ref, regardless of whether the original has changed. + self.set_ref(new_ref, to_modify) + + if current_ref == new_ref or not save: # Note: We do not look for and propagate changes at this point # which might result in desync depending if something changes about # tracking in the future. For now, this is quite safe. @@ -1008,6 +999,9 @@ class Source(Plugin): if current_ref != new_ref: self.info("Found new revision: {}".format(new_ref)) + # Save ref in local process for subsequent sources + self._set_ref(new_ref, save=False) + return new_ref # _requires_previous_sources() |