diff options
author | Jesse Keating <omgjlk@us.ibm.com> | 2017-05-04 16:08:58 -0700 |
---|---|---|
committer | Jesse Keating <omgjlk@us.ibm.com> | 2017-05-25 11:34:55 -0700 |
commit | 3a00ae807f0dcdcaf87b4892c1cbae13e0edffcf (patch) | |
tree | 5eeef54090422f22e522525a589b6870cecd71df /zuul/driver/github/githubmodel.py | |
parent | 01f3841484770f9b6f9c682725ea032aecac7988 (diff) | |
download | zuul-3a00ae807f0dcdcaf87b4892c1cbae13e0edffcf.tar.gz |
Implement github trigger requirement status
This allows using a connection specific requirement on the status of the
head of a PR. A list of statuses is accepted, just like the pipeline
requirement.
Update GithubRefFilter class to be more clear that it deals with
required statuses, whereas the event filter works with the status being
provided.
Change-Id: Ib91f6527bf1d8ff5fbc6434c8adaca1cd5e1ba6d
Diffstat (limited to 'zuul/driver/github/githubmodel.py')
-rw-r--r-- | zuul/driver/github/githubmodel.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/zuul/driver/github/githubmodel.py b/zuul/driver/github/githubmodel.py index bbacc9b1b..85738d8f7 100644 --- a/zuul/driver/github/githubmodel.py +++ b/zuul/driver/github/githubmodel.py @@ -59,10 +59,11 @@ class GithubTriggerEvent(TriggerEvent): return False -class GithubReviewFilter(object): - def __init__(self, required_reviews=[]): +class GithubCommonFilter(object): + def __init__(self, required_reviews=[], required_statuses=[]): self._required_reviews = copy.deepcopy(required_reviews) self.required_reviews = self._tidy_reviews(required_reviews) + self.required_statuses = required_statuses def _tidy_reviews(self, reviews): for r in reviews: @@ -126,14 +127,27 @@ class GithubReviewFilter(object): return False return True + def matchesRequiredStatuses(self, change): + # statuses are ORed + # A PR head can have multiple statuses on it. If the change + # statuses and the filter statuses are a null intersection, there + # are no matches and we return false + if self.required_statuses: + if set(change.status).isdisjoint(set(self.required_statuses)): + return False + return True + -class GithubEventFilter(EventFilter): +class GithubEventFilter(EventFilter, GithubCommonFilter): def __init__(self, trigger, types=[], branches=[], refs=[], comments=[], actions=[], labels=[], unlabels=[], - states=[], statuses=[], ignore_deletes=True): + states=[], statuses=[], required_statuses=[], + ignore_deletes=True): EventFilter.__init__(self, trigger) + GithubCommonFilter.__init__(self, required_statuses=required_statuses) + self._types = types self._branches = branches self._refs = refs @@ -147,6 +161,7 @@ class GithubEventFilter(EventFilter): self.unlabels = unlabels self.states = states self.statuses = statuses + self.required_statuses = required_statuses self.ignore_deletes = ignore_deletes def __repr__(self): @@ -172,6 +187,8 @@ class GithubEventFilter(EventFilter): ret += ' states: %s' % ', '.join(self.states) if self.statuses: ret += ' statuses: %s' % ', '.join(self.statuses) + if self.required_statuses: + ret += ' required_statuses: %s' % ', '.join(self.required_statuses) ret += '>' return ret @@ -239,14 +256,18 @@ class GithubEventFilter(EventFilter): if self.statuses and event.status not in self.statuses: return False + if not self.matchesRequiredStatuses(change): + return False + return True -class GithubRefFilter(RefFilter, GithubReviewFilter): +class GithubRefFilter(RefFilter, GithubCommonFilter): def __init__(self, statuses=[], required_reviews=[]): RefFilter.__init__(self) - GithubReviewFilter.__init__(self, required_reviews=required_reviews) + GithubCommonFilter.__init__(self, required_reviews=required_reviews, + required_statuses=statuses) self.statuses = statuses def __repr__(self): @@ -263,13 +284,8 @@ class GithubRefFilter(RefFilter, GithubReviewFilter): return ret def matches(self, change): - # statuses are ORed - # A PR head can have multiple statuses on it. If the change - # statuses and the filter statuses are a null intersection, there - # are no matches and we return false - if self.statuses: - if set(change.status).isdisjoint(set(self.statuses)): - return False + if not self.matchesRequiredStatuses(change): + return False # required reviews are ANDed if not self.matchesReviews(change): |