summaryrefslogtreecommitdiff
path: root/zuul/driver
diff options
context:
space:
mode:
Diffstat (limited to 'zuul/driver')
-rw-r--r--zuul/driver/pagure/pagureconnection.py34
-rw-r--r--zuul/driver/pagure/paguremodel.py24
-rw-r--r--zuul/driver/pagure/paguresource.py4
-rw-r--r--zuul/driver/pagure/paguretrigger.py2
4 files changed, 55 insertions, 9 deletions
diff --git a/zuul/driver/pagure/pagureconnection.py b/zuul/driver/pagure/pagureconnection.py
index 8d91df223..313a900bf 100644
--- a/zuul/driver/pagure/pagureconnection.py
+++ b/zuul/driver/pagure/pagureconnection.py
@@ -18,6 +18,7 @@ import hashlib
import queue
import threading
import time
+import re
import json
import requests
import cherrypy
@@ -194,13 +195,17 @@ class PagureEventConnector(threading.Thread):
self.daemon = True
self.connection = connection
self._stopped = False
+ self.metadata_notif = re.compile(
+ r"^\*\*Metadata Update", re.MULTILINE)
self.event_handler_mapping = {
'pull-request.comment.added': self._event_issue_comment,
'pull-request.new': self._event_pull_request,
'pull-request.flag.added': self._event_flag_added,
'git.receive': self._event_ref_updated,
'pull-request.initial_comment.edited':
- self._event_issue_initial_comment
+ self._event_issue_initial_comment,
+ 'pull-request.tag.added':
+ self._event_pull_request_tags_changed
}
def stop(self):
@@ -244,16 +249,19 @@ class PagureEventConnector(threading.Thread):
self.connection.logEvent(event)
self.connection.sched.addEvent(event)
- def _event_base(self, body):
+ def _event_base(self, body, pull_data_field='pullrequest'):
event = PagureTriggerEvent()
- if 'pullrequest' in body['msg']:
- data = body['msg']['pullrequest']
+
+ if pull_data_field in body['msg']:
+ data = body['msg'][pull_data_field]
+ data['tags'] = body['msg'].get('tags', [])
data['flag'] = body['msg'].get('flag')
event.title = data.get('title')
event.project_name = data.get('project', {}).get('fullname')
event.change_number = data.get('id')
event.updated_at = data.get('date_created')
event.branch = data.get('branch')
+ event.tags = data.get('tags', [])
event.change_url = self.connection.getPullUrl(event.project_name,
event.change_number)
event.ref = "refs/pull/%s/head" % event.change_number
@@ -271,12 +279,21 @@ class PagureEventConnector(threading.Thread):
event.action = 'changed'
return event
+ def _event_pull_request_tags_changed(self, body):
+ """ Handles pull request metadata change """
+ # pull-request.tag.added/removed use pull_request in payload body
+ event, _ = self._event_base(body, pull_data_field='pull_request')
+ event.action = 'tagged'
+ return event
+
def _event_issue_comment(self, body):
""" Handles pull request comments """
# https://fedora-fedmsg.readthedocs.io/en/latest/topics.html#pagure-pull-request-comment-added
event, data = self._event_base(body)
last_comment = data.get('comments', [])[-1]
- if last_comment.get('notification') is True:
+ if (last_comment.get('notification') is True and
+ not self.metadata_notif.match(
+ last_comment.get('comment', ''))):
# An updated PR (new commits) triggers the comment.added
# event. A message is added by pagure on the PR but notification
# is set to true.
@@ -556,7 +573,8 @@ class PagureConnection(BaseConnection):
self.connectors = {}
self.source = driver.getSource(self)
self.event_queue = queue.Queue()
-
+ self.metadata_notif = re.compile(
+ r"^\*\*Metadata Update", re.MULTILINE)
self.sched = None
def onLoad(self):
@@ -793,6 +811,9 @@ class PagureConnection(BaseConnection):
for comment in pr.get('comments', []):
# PR updated are reported as comment but with the notification flag
if comment['notification']:
+ # Ignore metadata update such as assignee and tags
+ if self.metadata_notif.match(comment.get('comment', '')):
+ continue
date = int(comment['date_created'])
if date > last_pr_code_updated:
last_pr_code_updated = date
@@ -822,6 +843,7 @@ class PagureConnection(BaseConnection):
change.patchset = change.pr.get('commit_stop')
change.files = change.pr.get('files')
change.title = change.pr.get('title')
+ change.tags = change.pr.get('tags')
change.open = change.pr.get('status') == 'Open'
change.is_merged = change.pr.get('status') == 'Merged'
change.status = self.getStatus(change.project, change.number)
diff --git a/zuul/driver/pagure/paguremodel.py b/zuul/driver/pagure/paguremodel.py
index 5036fc8a7..f62e7f787 100644
--- a/zuul/driver/pagure/paguremodel.py
+++ b/zuul/driver/pagure/paguremodel.py
@@ -27,6 +27,7 @@ class PullRequest(Change):
self.title = None
self.score = 0
self.files = []
+ self.tags = []
def __repr__(self):
r = ['<Change 0x%x' % id(self)]
@@ -42,6 +43,8 @@ class PullRequest(Change):
r.append('status: %s' % self.status)
if self.score:
r.append('score: %s' % self.score)
+ if self.tags:
+ r.append('tags: %s' % ', '.join(self.tags))
if self.is_merged:
r.append('state: merged')
if self.open:
@@ -64,6 +67,7 @@ class PagureTriggerEvent(TriggerEvent):
self.title = None
self.action = None
self.status = None
+ self.tags = []
def _repr(self):
r = [super(PagureTriggerEvent, self)._repr()]
@@ -74,6 +78,8 @@ class PagureTriggerEvent(TriggerEvent):
r.append("project:%s" % self.canonical_project_name)
if self.change_number:
r.append("pr:%s" % self.change_number)
+ if self.tags:
+ r.append("tags:%s" % ', '.join(self.tags))
return ' '.join(r)
def isPatchsetCreated(self):
@@ -84,7 +90,7 @@ class PagureTriggerEvent(TriggerEvent):
class PagureEventFilter(EventFilter):
def __init__(self, trigger, types=[], refs=[], statuses=[],
- comments=[], actions=[], ignore_deletes=True):
+ comments=[], actions=[], tags=[], ignore_deletes=True):
EventFilter.__init__(self, trigger)
@@ -96,6 +102,7 @@ class PagureEventFilter(EventFilter):
self.comments = [re.compile(x) for x in comments]
self.actions = actions
self.statuses = statuses
+ self.tags = tags
self.ignore_deletes = ignore_deletes
def __repr__(self):
@@ -113,6 +120,8 @@ class PagureEventFilter(EventFilter):
ret += ' actions: %s' % ', '.join(self.actions)
if self.statuses:
ret += ' statuses: %s' % ', '.join(self.statuses)
+ if self.tags:
+ ret += ' tags: %s' % ', '.join(self.tags)
ret += '>'
return ret
@@ -159,6 +168,10 @@ class PagureEventFilter(EventFilter):
if self.statuses and not matches_status:
return False
+ if self.tags:
+ if not set(event.tags).intersection(set(self.tags)):
+ return False
+
return True
@@ -166,12 +179,13 @@ class PagureEventFilter(EventFilter):
# pipeline requires definition)
class PagureRefFilter(RefFilter):
def __init__(self, connection_name, score=None,
- open=None, merged=None, status=None):
+ open=None, merged=None, status=None, tags=[]):
RefFilter.__init__(self, connection_name)
self.score = score
self.open = open
self.merged = merged
self.status = status
+ self.tags = tags
def __repr__(self):
ret = '<PagureRefFilter connection_name: %s ' % self.connection_name
@@ -183,6 +197,8 @@ class PagureRefFilter(RefFilter):
ret += ' merged: %s' % self.merged
if self.status is not None:
ret += ' status: %s' % self.status
+ if self.tags:
+ ret += ' tags: %s' % ', '.join(self.tags)
ret += '>'
return ret
@@ -203,4 +219,8 @@ class PagureRefFilter(RefFilter):
if change.status != self.status:
return False
+ if self.tags:
+ if not set(change.tags).intersection(set(self.tags)):
+ return False
+
return True
diff --git a/zuul/driver/pagure/paguresource.py b/zuul/driver/pagure/paguresource.py
index 00ee07830..40862d307 100644
--- a/zuul/driver/pagure/paguresource.py
+++ b/zuul/driver/pagure/paguresource.py
@@ -20,6 +20,7 @@ from zuul.source import BaseSource
from zuul.model import Project
from zuul.driver.pagure.paguremodel import PagureRefFilter
+from zuul.driver.util import scalar_or_list, to_list
class PagureSource(BaseSource):
@@ -117,7 +118,6 @@ class PagureSource(BaseSource):
"""Get the git-web url for a project."""
raise NotImplementedError()
- # This driver does not implement pipeline requirements.
def getRequireFilters(self, config):
f = PagureRefFilter(
connection_name=self.connection.connection_name,
@@ -125,6 +125,7 @@ class PagureSource(BaseSource):
open=config.get('open'),
merged=config.get('merged'),
status=config.get('status'),
+ tags=to_list(config.get('tags'))
)
return [f]
@@ -142,6 +143,7 @@ def getRequireSchema():
'open': bool,
'merged': bool,
'status': str,
+ 'tags': scalar_or_list(str)
}
return require
diff --git a/zuul/driver/pagure/paguretrigger.py b/zuul/driver/pagure/paguretrigger.py
index 61c1fe289..e475e49e6 100644
--- a/zuul/driver/pagure/paguretrigger.py
+++ b/zuul/driver/pagure/paguretrigger.py
@@ -33,6 +33,7 @@ class PagureTrigger(BaseTrigger):
refs=to_list(trigger.get('ref')),
comments=to_list(trigger.get('comment')),
statuses=to_list(trigger.get('status')),
+ tags=to_list(trigger.get('tag')),
)
efilters.append(f)
@@ -56,6 +57,7 @@ def getSchema():
'ref': scalar_or_list(str),
'comment': scalar_or_list(str),
'status': scalar_or_list(str),
+ 'tag': scalar_or_list(str)
}
return pagure_trigger