diff options
author | James E. Blair <jeblair@hp.com> | 2014-12-16 17:19:04 -0800 |
---|---|---|
committer | James E. Blair <jeblair@hp.com> | 2015-01-29 11:11:14 -0800 |
commit | 6965a4b596bf9d8a2b55b3314584c4ad7f802df6 (patch) | |
tree | e46b0e9a8f4c2f74b651ef0fb1506e4eb3d52f0d | |
parent | 6d2217c40c4b05d2ce6ce7bf29d18691c89cdc4d (diff) | |
download | zuul-6965a4b596bf9d8a2b55b3314584c4ad7f802df6.tar.gz |
Make needs_change plural
Does not actually handle more than one change correctly yet.
Just turns the attribute into a list and makes current processing
iterative.
Change-Id: I1acd62125b315fdcf04594cb52a71b16093884a7
-rw-r--r-- | zuul/model.py | 6 | ||||
-rw-r--r-- | zuul/scheduler.py | 81 | ||||
-rw-r--r-- | zuul/trigger/gerrit.py | 4 |
3 files changed, 54 insertions, 37 deletions
diff --git a/zuul/model.py b/zuul/model.py index b705982bf..3bba28467 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -852,7 +852,7 @@ class Change(Changeish): self.refspec = None self.files = [] - self.needs_change = None + self.needs_changes = [] self.needed_by_changes = [] self.is_current_patchset = True self.can_merge = False @@ -885,8 +885,8 @@ class Change(Changeish): def getRelatedChanges(self): related = set() - if self.needs_change: - related.add(self.needs_change) + for c in self.needs_changes: + related.add(c) for c in self.needed_by_changes: related.add(c) related.update(c.getRelatedChanges()) diff --git a/zuul/scheduler.py b/zuul/scheduler.py index 7d41fb182..1a9e714ee 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -1073,7 +1073,7 @@ class BasePipelineManager(object): def checkForChangesNeededBy(self, change): return True - def getFailingDependentItem(self, item): + def getFailingDependentItems(self, item): return None def getDependentItems(self, item): @@ -1300,11 +1300,11 @@ class BasePipelineManager(object): except MergeFailure: pass return (True, nnfi, ready_ahead) - dep_item = self.getFailingDependentItem(item) + dep_items = self.getFailingDependentItems(item) actionable = change_queue.isActionable(item) item.active = actionable ready = False - if dep_item: + if dep_items: failing_reasons.append('a needed change is failing') self.cancelJobs(item, prime=False) else: @@ -1784,46 +1784,63 @@ class DependentPipelineManager(BasePipelineManager): return ret self.log.debug(" Change %s must be merged ahead of %s" % (ret, change)) - return self.addChange(ret, quiet=quiet, - ignore_requirements=ignore_requirements) + for needed_change in ret: + r = self.addChange(needed_change, quiet=quiet, + ignore_requirements=ignore_requirements) + if not r: + return False + return True def checkForChangesNeededBy(self, change): self.log.debug("Checking for changes needed by %s:" % change) # Return true if okay to proceed enqueing this change, # false if the change should not be enqueued. - if not hasattr(change, 'needs_change'): + if not hasattr(change, 'needs_changes'): self.log.debug(" Changeish does not support dependencies") return True - if not change.needs_change: + if not change.needs_changes: self.log.debug(" No changes needed") return True - if change.needs_change.is_merged: - self.log.debug(" Needed change is merged") - return True - if not change.needs_change.is_current_patchset: - self.log.debug(" Needed change is not the current patchset") + changes_needed = [] + # TODO (jeblair): this is only correct for a list of 1 element + for needed_change in change.needs_changes: + self.log.debug(" Change %s needs change %s:" % ( + change, needed_change)) + if needed_change.is_merged: + self.log.debug(" Needed change is merged") + continue + if not needed_change.is_current_patchset: + self.log.debug(" Needed change is not the current patchset") + return False + if self.isChangeAlreadyInQueue(needed_change): + self.log.debug(" Needed change is already ahead in the queue") + continue + if self.pipeline.source.canMerge(needed_change, + self.getSubmitAllowNeeds()): + self.log.debug(" Change %s is needed" % needed_change) + if needed_change not in changes_needed: + changes_needed.append(needed_change) + continue + # The needed change can't be merged. + self.log.debug(" Change %s is needed but can not be merged" % + needed_change) return False - if self.isChangeAlreadyInQueue(change.needs_change): - self.log.debug(" Needed change is already ahead in the queue") - return True - if self.pipeline.source.canMerge(change.needs_change, - self.getSubmitAllowNeeds()): - self.log.debug(" Change %s is needed" % - change.needs_change) - return change.needs_change - # The needed change can't be merged. - self.log.debug(" Change %s is needed but can not be merged" % - change.needs_change) - return False + if changes_needed: + return changes_needed + return True - def getFailingDependentItem(self, item): - if not hasattr(item.change, 'needs_change'): - return None - if not item.change.needs_change: + def getFailingDependentItems(self, item): + if not hasattr(item.change, 'needs_changes'): return None - needs_item = self.getItemForChange(item.change.needs_change) - if not needs_item: + if not item.change.needs_changes: return None - if needs_item.current_build_set.failing_reasons: - return needs_item + failing_items = set() + for needed_change in item.change.needs_changes: + needed_item = self.getItemForChange(needed_change) + if not needed_item: + continue + if needed_item.current_build_set.failing_reasons: + failing_items.add(needed_item) + if failing_items: + return failing_items return None diff --git a/zuul/trigger/gerrit.py b/zuul/trigger/gerrit.py index 6782534c2..0a931f0bf 100644 --- a/zuul/trigger/gerrit.py +++ b/zuul/trigger/gerrit.py @@ -382,13 +382,13 @@ class Gerrit(object): # for dependencies. return change - change.needs_change = None + change.needs_changes = [] if 'dependsOn' in data: parts = data['dependsOn'][0]['ref'].split('/') dep_num, dep_ps = parts[3], parts[4] dep = self._getChange(dep_num, dep_ps) if not dep.is_merged: - change.needs_change = dep + change.needs_changes.append(dep) change.needed_by_changes = [] if 'neededBy' in data: |