Add option to ignore ref-updated events emitted by branch deletions
When a branch is deleted, gerrit emits a ref-updated event with a newrev
value of all zeros. This adds a boolean field to optionally not trigger
on these ref-updated events.
Change-Id: Iea75d05ddcb49b0bf748b72b9d2d5472d077f0c6
diff --git a/zuul/model.py b/zuul/model.py
index 8dc28df..888b868 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -22,6 +22,8 @@
'ordereddict.OrderedDict'])
+EMPTY_GIT_REF = '0' * 40 # git sha of all zeros, used during creates/deletes
+
MERGER_MERGE = 1 # "git merge"
MERGER_MERGE_RESOLVE = 2 # "git merge -s resolve"
MERGER_CHERRY_PICK = 3 # "git cherry-pick"
@@ -1077,7 +1079,8 @@
class EventFilter(BaseFilter):
def __init__(self, trigger, types=[], branches=[], refs=[],
event_approvals={}, comments=[], emails=[], usernames=[],
- timespecs=[], required_approvals=[], pipelines=[]):
+ timespecs=[], required_approvals=[], pipelines=[],
+ ignore_deletes=True):
super(EventFilter, self).__init__(
required_approvals=required_approvals)
self.trigger = trigger
@@ -1097,6 +1100,7 @@
self.pipelines = [re.compile(x) for x in pipelines]
self.event_approvals = event_approvals
self.timespecs = timespecs
+ self.ignore_deletes = ignore_deletes
def __repr__(self):
ret = '<EventFilter'
@@ -1109,6 +1113,8 @@
ret += ' branches: %s' % ', '.join(self._branches)
if self._refs:
ret += ' refs: %s' % ', '.join(self._refs)
+ if self.ignore_deletes:
+ ret += ' ignore_deletes: %s' % self.ignore_deletes
if self.event_approvals:
ret += ' event_approvals: %s' % ', '.join(
['%s:%s' % a for a in self.event_approvals.items()])
@@ -1160,6 +1166,10 @@
matches_ref = True
if self.refs and not matches_ref:
return False
+ if self.ignore_deletes and event.newrev == EMPTY_GIT_REF:
+ # If the updated ref has an empty git sha (all 0s),
+ # then the ref is being deleted
+ return False
# comments are ORed
matches_comment_re = False