diff options
Diffstat (limited to 'zuul')
-rw-r--r-- | zuul/driver/pagure/pagureconnection.py | 34 | ||||
-rw-r--r-- | zuul/driver/pagure/paguremodel.py | 24 | ||||
-rw-r--r-- | zuul/driver/pagure/paguresource.py | 4 | ||||
-rw-r--r-- | zuul/driver/pagure/paguretrigger.py | 2 |
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 |