diff options
author | Jesse Keating <omgjlk@us.ibm.com> | 2017-05-30 17:31:45 -0700 |
---|---|---|
committer | Jesse Keating <omgjlk@us.ibm.com> | 2017-06-05 14:07:43 -0700 |
commit | 8c2eb573be01687bc3f382f35953950149931fa7 (patch) | |
tree | 5188140d040b2c57fa938f5212e2e2bdd36cc061 /zuul/driver/github/githubmodel.py | |
parent | 6a22df5f54babc2f152b7c725696e5e5032f7765 (diff) | |
download | zuul-8c2eb573be01687bc3f382f35953950149931fa7.tar.gz |
Handle change related reqs on push like events
Push and ref-updated events do not have an associated change or
pull-request. Thus, requirements that are specific to changes or
pull-requests cannot possibly be met.
To make this work, Ref filters should only be applied to changes that
come from a matching connection. This was not previously enforced when
filters became connection specific.
Change-Id: I5d67bef264db0ad5ba3a7180ce74e3670ba822ce
Story: 2000774
Task: 4624
Diffstat (limited to 'zuul/driver/github/githubmodel.py')
-rw-r--r-- | zuul/driver/github/githubmodel.py | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/zuul/driver/github/githubmodel.py b/zuul/driver/github/githubmodel.py index 3e2511559..9516097d2 100644 --- a/zuul/driver/github/githubmodel.py +++ b/zuul/driver/github/githubmodel.py @@ -109,9 +109,13 @@ class GithubCommonFilter(object): return True def matchesReviews(self, change): - if self.required_reviews and not change.reviews: - # No reviews means no matching - return False + if self.required_reviews: + if not hasattr(change, 'number'): + # not a PR, no reviews + return False + if not change.reviews: + # No reviews means no matching + return False return self.matchesRequiredReviews(change) @@ -133,6 +137,9 @@ class GithubCommonFilter(object): # statuses and the filter statuses are a null intersection, there # are no matches and we return false if self.required_statuses: + if not hasattr(change, 'number'): + # not a PR, no status + return False if set(change.status).isdisjoint(set(self.required_statuses)): return False return True @@ -263,9 +270,9 @@ class GithubEventFilter(EventFilter, GithubCommonFilter): class GithubRefFilter(RefFilter, GithubCommonFilter): - def __init__(self, statuses=[], required_reviews=[], open=None, - current_patchset=None): - RefFilter.__init__(self) + def __init__(self, connection_name, statuses=[], required_reviews=[], + open=None, current_patchset=None): + RefFilter.__init__(self, connection_name) GithubCommonFilter.__init__(self, required_reviews=required_reviews, required_statuses=statuses) @@ -276,6 +283,7 @@ class GithubRefFilter(RefFilter, GithubCommonFilter): def __repr__(self): ret = '<GithubRefFilter' + ret += ' connection_name: %s' % self.connection_name if self.statuses: ret += ' statuses: %s' % ', '.join(self.statuses) if self.required_reviews: @@ -295,11 +303,21 @@ class GithubRefFilter(RefFilter, GithubCommonFilter): return False if self.open is not None: - if self.open != change.open: + # if a "change" has no number, it's not a change, but a push + # and cannot possibly pass this test. + if hasattr(change, 'number'): + if self.open != change.open: + return False + else: return False if self.current_patchset is not None: - if self.current_patchset != change.is_current_patchset: + # if a "change" has no number, it's not a change, but a push + # and cannot possibly pass this test. + if hasattr(change, 'number'): + if self.current_patchset != change.is_current_patchset: + return False + else: return False # required reviews are ANDed |