# Copyright 2019 Red Hat, Inc. # Copyright 2022 Acme Gating, LLC # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import re from zuul.model import Change, TriggerEvent, EventFilter, RefFilter EMPTY_GIT_REF = '0' * 40 # git sha of all zeros, used during creates/deletes class MergeRequest(Change): def __init__(self, project): super(MergeRequest, self).__init__(project) self.updated_at = None self.approved = None self.labels = None self.merge_status = None self.mr = None self.title = None def __repr__(self): r = ['' def serialize(self): d = super().serialize() d.update({ "updated_at": self.updated_at, "approved": self.approved, "labels": self.labels, "merge_status": self.merge_status, "mr": self.mr, "title": self.title, }) return d def deserialize(self, data): super().deserialize(data) self.updated_at = data.get("updated_at") self.approved = data.get("approved") self.labels = data.get("labels") self.merge_status = data.get("merge_status") self.mr = data.get("mr") self.title = data.get("title") def isUpdateOf(self, other): if (self.project == other.project and hasattr(other, 'number') and self.number == other.number and hasattr(other, 'updated_at') and self.updated_at > other.updated_at): return True return False class GitlabTriggerEvent(TriggerEvent): def __init__(self): super(GitlabTriggerEvent, self).__init__() self.trigger_name = 'gitlab' self.title = None self.action = None self.labels = [] self.unlabels = [] self.change_number = None self.merge_request_description_changed = None self.tag = None self.commits = [] self.total_commits_count = 0 def toDict(self): d = super().toDict() d["trigger_name"] = self.trigger_name d["title"] = self.title d["action"] = self.action d["labels"] = self.labels d["unlabels"] = self.unlabels d["change_number"] = self.change_number d["merge_request_description_changed"] = \ self.merge_request_description_changed d["tag"] = self.tag d["commits"] = self.commits d["total_commits_count"] = self.total_commits_count return d def updateFromDict(self, d): super().updateFromDict(d) self.trigger_name = d["trigger_name"] self.title = d["title"] self.action = d["action"] self.labels = d["labels"] self.unlabels = d.get("unlabels", []) self.change_number = d["change_number"] self.merge_request_description_changed = \ d["merge_request_description_changed"] self.tag = d["tag"] self.commits = d.get("commits", []) self.total_commits_count = d.get("total_commits_count", len(self.commits)) def _repr(self): r = [super(GitlabTriggerEvent, self)._repr()] if self.action: r.append("action:%s" % self.action) r.append("project:%s" % self.project_name) if self.change_number: r.append("mr:%s" % self.change_number) if self.labels: r.append("labels:%s" % ', '.join(self.labels)) if self.unlabels: r.append("unlabels:%s" % ', '.join(self.unlabels)) return ' '.join(r) def isPatchsetCreated(self): if self.type == 'gl_merge_request': return self.action in ['opened', 'changed'] return False def isMessageChanged(self): return bool(self.merge_request_description_changed) class GitlabEventFilter(EventFilter): def __init__( self, connection_name, trigger, types=None, actions=None, comments=None, refs=None, labels=None, unlabels=None, ignore_deletes=True): super().__init__(connection_name, trigger) self._types = types or [] self.types = [re.compile(x) for x in self._types] self.actions = actions or [] self._comments = comments or [] self.comments = [re.compile(x) for x in self._comments] self._refs = refs or [] self.refs = [re.compile(x) for x in self._refs] self.labels = labels or [] self.unlabels = unlabels or [] self.ignore_deletes = ignore_deletes def __repr__(self): ret = '