diff --git a/zuul/manager/__init__.py b/zuul/manager/__init__.py index 44eb6aef25..70174079a6 100644 --- a/zuul/manager/__init__.py +++ b/zuul/manager/__init__.py @@ -599,7 +599,6 @@ class PipelineManager(metaclass=ABCMeta): # Search for Depends-On headers and find appropriate changes log.debug(" Updating commit dependencies for %s", change) - change.refresh_deps = False dependencies = [] seen = set() for match in find_dependency_headers(change.message): @@ -620,7 +619,12 @@ class PipelineManager(metaclass=ABCMeta): if dep and (not dep.is_merged) and dep not in dependencies: log.debug(" Adding dependency: %s", dep) dependencies.append(dep) - change.commit_needs_changes = dependencies + source = self.sched.connections.getSource( + change.project.connection_name) + source.setChangeAttributes( + change, + commit_needs_changes=[d for d in dependencies], + refresh_deps=False) def provisionNodes(self, item): log = item.annotateLogger(self.log) @@ -1458,7 +1462,9 @@ class PipelineManager(metaclass=ABCMeta): def onFilesChangesCompleted(self, event, build_set): item = build_set.item - item.change.files = event.files + source = self.sched.connections.getSource( + item.change.project.connection_name) + source.setChangeAttributes(item.change, files=event.files) build_set.files_state = build_set.COMPLETE def onMergeCompleted(self, event, build_set): @@ -1469,7 +1475,11 @@ class PipelineManager(metaclass=ABCMeta): def _onMergeCompleted(self, event, build_set): item = build_set.item - item.change.containing_branches = event.item_in_branches + source = self.sched.connections.getSource( + item.change.project.connection_name) + if isinstance(item.change, model.Tag): + source.setChangeAttributes( + item.change, containing_branches=event.item_in_branches) build_set.merge_state = build_set.COMPLETE build_set.repo_state = event.repo_state if event.merged: diff --git a/zuul/scheduler.py b/zuul/scheduler.py index 04b895577a..0afc3555aa 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -2192,8 +2192,11 @@ class Scheduler(threading.Thread): continue for dep in other_change.commit_needs_changes: if change.isUpdateOf(dep): - other_change.refresh_deps = True - change.refresh_deps = True + source.setChangeAttributes( + other_change, refresh_deps=True) + + source = self.connections.getSource(change.project.connection_name) + source.setChangeAttributes(change, refresh_deps=True) def cancelJob(self, buildset, job, build=None, final=False, force=False): diff --git a/zuul/source/__init__.py b/zuul/source/__init__.py index 5734261b17..d3a11be6ca 100644 --- a/zuul/source/__init__.py +++ b/zuul/source/__init__.py @@ -126,3 +126,15 @@ class BaseSource(object, metaclass=abc.ABCMeta): def getRejectFilters(self, config): """Return a list of ChangeFilters for the scheduler to match against. """ + + def setChangeAttributes(self, change, **attrs): + """"Set the provided attributes on the given change. + + This method must be used when modifying attributes of a change + outside the driver context. The driver needs to make sure that + the change is also reflected in the cache in Zookeeper. + """ + # TODO (swestphahl): Remove this workaround after all drivers + # have been converted to use a Zookeeper backed changed cache. + for name, value in attrs.items(): + setattr(change, name, value)