summaryrefslogtreecommitdiff
path: root/zuul/driver/github/githubmodel.py
diff options
context:
space:
mode:
authorJesse Keating <omgjlk@us.ibm.com>2017-05-30 17:31:45 -0700
committerJesse Keating <omgjlk@us.ibm.com>2017-06-05 14:07:43 -0700
commit8c2eb573be01687bc3f382f35953950149931fa7 (patch)
tree5188140d040b2c57fa938f5212e2e2bdd36cc061 /zuul/driver/github/githubmodel.py
parent6a22df5f54babc2f152b7c725696e5e5032f7765 (diff)
downloadzuul-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.py34
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