From b88192d5bbc101e674269aa09f4b4471cd002384 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Mon, 18 Nov 2019 03:28:15 +0100 Subject: [PATCH] integrations: Add Gitea integration. Gitea integration adopted from Gogs integration with minor adjusting. More events are now handled. Fixes #13346 --- static/images/integrations/gitea/001.png | Bin 0 -> 15546 bytes static/images/integrations/logos/gitea.png | Bin 0 -> 3365 bytes zerver/lib/integrations.py | 1 + zerver/webhooks/gitea/__init__.py | 0 zerver/webhooks/gitea/doc.md | 19 ++ .../gitea/fixtures/create__branch.json | 75 +++++ .../gitea/fixtures/issue_comment__edited.json | 163 +++++++++++ .../gitea/fixtures/issue_comment__in_pr.json | 137 +++++++++ .../gitea/fixtures/issue_comment__new.json | 134 +++++++++ .../gitea/fixtures/issues__assigned.json | 135 +++++++++ .../gitea/fixtures/issues__closed.json | 135 +++++++++ .../gitea/fixtures/issues__edited.json | 140 ++++++++++ .../gitea/fixtures/issues__opened.json | 111 ++++++++ .../gitea/fixtures/issues__reopened.json | 135 +++++++++ .../fixtures/pull_request__assigned.json | 263 ++++++++++++++++++ .../gitea/fixtures/pull_request__closed.json | 239 ++++++++++++++++ .../gitea/fixtures/pull_request__edited.json | 244 ++++++++++++++++ .../gitea/fixtures/pull_request__merged.json | 250 +++++++++++++++++ .../gitea/fixtures/pull_request__opened.json | 239 ++++++++++++++++ .../fixtures/pull_request__reopened.json | 239 ++++++++++++++++ .../gitea/fixtures/push__5_commits.json | 201 +++++++++++++ zerver/webhooks/gitea/tests.py | 105 +++++++ zerver/webhooks/gitea/view.py | 167 +++++++++++ 23 files changed, 3132 insertions(+) create mode 100644 static/images/integrations/gitea/001.png create mode 100644 static/images/integrations/logos/gitea.png create mode 100644 zerver/webhooks/gitea/__init__.py create mode 100644 zerver/webhooks/gitea/doc.md create mode 100644 zerver/webhooks/gitea/fixtures/create__branch.json create mode 100644 zerver/webhooks/gitea/fixtures/issue_comment__edited.json create mode 100644 zerver/webhooks/gitea/fixtures/issue_comment__in_pr.json create mode 100644 zerver/webhooks/gitea/fixtures/issue_comment__new.json create mode 100644 zerver/webhooks/gitea/fixtures/issues__assigned.json create mode 100644 zerver/webhooks/gitea/fixtures/issues__closed.json create mode 100644 zerver/webhooks/gitea/fixtures/issues__edited.json create mode 100644 zerver/webhooks/gitea/fixtures/issues__opened.json create mode 100644 zerver/webhooks/gitea/fixtures/issues__reopened.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__assigned.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__closed.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__edited.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__merged.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__opened.json create mode 100644 zerver/webhooks/gitea/fixtures/pull_request__reopened.json create mode 100644 zerver/webhooks/gitea/fixtures/push__5_commits.json create mode 100644 zerver/webhooks/gitea/tests.py create mode 100644 zerver/webhooks/gitea/view.py diff --git a/static/images/integrations/gitea/001.png b/static/images/integrations/gitea/001.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ff3f215094443e5c91735c89c7d7e86c82c860 GIT binary patch literal 15546 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%0ALGIGQt|KZUq~2nmIz=bD$aZNul8J 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 J3K4_A{|jD|q8R`H literal 0 HcmV?d00001 diff --git a/static/images/integrations/logos/gitea.png b/static/images/integrations/logos/gitea.png new file mode 100644 index 0000000000000000000000000000000000000000..405f40f17099ed60d4c5248213d0a37ca2eab86a GIT binary patch literal 3365 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 None: + expected_topic = u"test / d" + expected_message = u"""kostekIV [pushed](https://try.gitea.io/kostekIV/test/compare/21138d2ca0ce18f8e037696fdbe1b3f0c211f630...2ec0c971d04723523aa20f2b378f8b419b47d4ec) 5 commits to branch d. + +* commit ([2ec0c97](https://try.gitea.io/kostekIV/test/commit/2ec0c971d04723523aa20f2b378f8b419b47d4ec)) +* commit ([6cb1701](https://try.gitea.io/kostekIV/test/commit/6cb1701c8b0114ad716f4cd49153076e7109cb85)) +* commit ([6773eab](https://try.gitea.io/kostekIV/test/commit/6773eabc0778a3e38997c06a13f5f0c48b67e5dc)) +* commit ([337402c](https://try.gitea.io/kostekIV/test/commit/337402cf675ce7082ddcd23d06a116c85241825a)) +* commit ([0a38cad](https://try.gitea.io/kostekIV/test/commit/0a38cad3fac3a13bb78b738d13f15ce9cc3343fa))""" + self.send_and_test_stream_message('push__5_commits', expected_topic, expected_message) + + def test_new_branch(self) -> None: + expected_topic = u"test / test-branch" + expected_message = u"kostekIV created [test-branch](https://try.gitea.io/kostekIV/test/src/test-branch) branch." + self.send_and_test_stream_message('create__branch', expected_topic, expected_message) + + def test_pull_request_opened(self) -> None: + expected_topic = u"test / PR #1905 New pr" + expected_message = u"""kostekIV opened [PR #4](https://try.gitea.io/kostekIV/test/pulls/4) from `test-branch` to `master`.""" + self.send_and_test_stream_message('pull_request__opened', expected_topic, expected_message) + + def test_pull_request_merged(self) -> None: + expected_topic = u"test / PR #1905 New pr" + expected_message = u"""kostekIV merged [PR #4](https://try.gitea.io/kostekIV/test/pulls/4) from `test-branch` to `master`.""" + self.send_and_test_stream_message('pull_request__merged', expected_topic, expected_message) + + def test_pull_request_edited(self) -> None: + expected_topic = u"test / PR #1906 test 2" + expected_message = u"""kostekIV edited [PR #5](https://try.gitea.io/kostekIV/test/pulls/5) from `d` to `master`.""" + self.send_and_test_stream_message('pull_request__edited', expected_topic, expected_message) + + def test_pull_request_reopened(self) -> None: + expected_topic = u"test / PR #1906 test 2" + expected_message = u"""kostekIV reopened [PR #5](https://try.gitea.io/kostekIV/test/pulls/5) from `d` to `master`.""" + self.send_and_test_stream_message('pull_request__reopened', expected_topic, expected_message) + + def test_pull_request_closed(self) -> None: + expected_topic = u"test / PR #1906 test 2" + expected_message = u"""kostekIV closed [PR #5](https://try.gitea.io/kostekIV/test/pulls/5) from `d` to `master`.""" + self.send_and_test_stream_message('pull_request__closed', expected_topic, expected_message) + + def test_pull_request_assigned(self) -> None: + expected_topic = u"test / PR #1906 test 2" + expected_message = u"""kostekIV assigned [PR #5](https://try.gitea.io/kostekIV/test/pulls/5) (assigned to kostekIV) from `d` to `master`.""" + self.send_and_test_stream_message('pull_request__assigned', expected_topic, expected_message) + + def test_issues_opened(self) -> None: + expected_topic = u"test / Issue #3 Test issue" + expected_message = u"""kostekIV opened [Issue #3](https://try.gitea.io/kostekIV/test/issues/3):\n\n~~~ quote\nTest body\n~~~""" + self.send_and_test_stream_message('issues__opened', expected_topic, expected_message) + + def test_issues_edited(self) -> None: + expected_topic = u"test / Issue #3 Test issue 2" + expected_message = u"""kostekIV edited [Issue #3](https://try.gitea.io/kostekIV/test/issues/3) (assigned to kostekIV):\n\n~~~ quote\nTest body\n~~~""" + self.send_and_test_stream_message('issues__edited', expected_topic, expected_message) + + def test_issues_closed(self) -> None: + expected_topic = u"test / Issue #3 Test issue 2" + expected_message = u"""kostekIV closed [Issue #3](https://try.gitea.io/kostekIV/test/issues/3) (assigned to kostekIV):\n\n~~~ quote\nTest body\n~~~""" + self.send_and_test_stream_message('issues__closed', expected_topic, expected_message) + + def test_issues_assigned(self) -> None: + expected_topic = u"test / Issue #3 Test issue" + expected_message = u"""kostekIV assigned [Issue #3](https://try.gitea.io/kostekIV/test/issues/3) (assigned to kostekIV):\n\n~~~ quote\nTest body\n~~~""" + self.send_and_test_stream_message('issues__assigned', expected_topic, expected_message) + + def test_issues_reopened(self) -> None: + expected_topic = u"test / Issue #3 Test issue 2" + expected_message = u"""kostekIV reopened [Issue #3](https://try.gitea.io/kostekIV/test/issues/3) (assigned to kostekIV):\n\n~~~ quote\nTest body\n~~~""" + self.send_and_test_stream_message('issues__reopened', expected_topic, expected_message) + + def test_issue_comment_new(self) -> None: + expected_topic = u"test / Issue #3 Test issue" + expected_message = u"""kostekIV [commented](https://try.gitea.io/kostekIV/test/issues/3#issuecomment-24400) on [Issue #3](https://try.gitea.io/kostekIV/test/issues/3):\n\n~~~ quote\ntest comment\n~~~""" + self.send_and_test_stream_message('issue_comment__new', expected_topic, expected_message) + + def test_issue_comment_in_pr(self) -> None: + expected_topic = u"test / Issue #1 dummy" + expected_message = u"""kostekIV [commented](https://try.gitea.io/kostekIV/test/pulls/1/files#issuecomment-24399) on [Issue #1](https://try.gitea.io/kostekIV/test/issues/1):\n\n~~~ quote\ntest comment\n~~~""" + self.send_and_test_stream_message('issue_comment__in_pr', expected_topic, expected_message) + + def test_issue_comment_edited(self) -> None: + expected_topic = u"test / Issue #3 Test issue 2" + expected_message = u"""kostekIV edited a [comment](https://try.gitea.io/kostekIV/test/issues/3#issuecomment-24400) on [Issue #3](https://try.gitea.io/kostekIV/test/issues/3):\n\n~~~ quote\nedit test comment\n~~~""" + + self.send_and_test_stream_message('issue_comment__edited', expected_topic, expected_message) + + @patch('zerver.webhooks.gitea.view.check_send_webhook_message') + def test_push_filtered_by_branches_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: + self.url = self.build_webhook_url(branches='changes,development') + payload = self.get_body('push__5_commits') + result = self.client_post(self.url, payload, HTTP_X_GITEA_EVENT='push', + content_type="application/json") + self.assertFalse(check_send_webhook_message_mock.called) + self.assert_json_success(result) diff --git a/zerver/webhooks/gitea/view.py b/zerver/webhooks/gitea/view.py new file mode 100644 index 0000000000..c3b50a1952 --- /dev/null +++ b/zerver/webhooks/gitea/view.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +from typing import Any, Dict, Optional + +from django.http import HttpRequest, HttpResponse + +from zerver.decorator import api_key_only_webhook_view +from zerver.lib.request import REQ, has_request_variables +from zerver.lib.response import json_success +from zerver.lib.webhooks.common import check_send_webhook_message, \ + validate_extract_webhook_http_header, UnexpectedWebhookEventType, \ + get_http_headers_from_filename +from zerver.lib.webhooks.git import TOPIC_WITH_BRANCH_TEMPLATE, \ + TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE, get_create_branch_event_message, \ + get_pull_request_event_message, get_push_commits_event_message, \ + get_issue_event_message +from zerver.models import UserProfile + +fixture_to_headers = get_http_headers_from_filename("HTTP_X_GITEA_EVENT") + +def get_issue_url(repo_url: str, issue_nr: int) -> str: + return "{}/issues/{}".format(repo_url, issue_nr) + +def format_push_event(payload: Dict[str, Any]) -> str: + + for commit in payload['commits']: + commit['sha'] = commit['id'] + commit['name'] = (commit['author']['username'] or + commit['author']['name'].split()[0]) + + data = { + 'user_name': payload['sender']['username'], + 'compare_url': payload['compare_url'], + 'branch_name': payload['ref'].replace('refs/heads/', ''), + 'commits_data': payload['commits'] + } + + return get_push_commits_event_message(**data) + +def format_new_branch_event(payload: Dict[str, Any]) -> str: + + branch_name = payload['ref'] + url = '{}/src/{}'.format(payload['repository']['html_url'], branch_name) + + data = { + 'user_name': payload['sender']['username'], + 'url': url, + 'branch_name': branch_name + } + return get_create_branch_event_message(**data) + +def format_pull_request_event(payload: Dict[str, Any], + include_title: Optional[bool]=False) -> str: + assignee = payload['pull_request']['assignee'] + data = { + 'user_name': payload['pull_request']['user']['username'], + 'action': payload['action'], + 'url': payload['pull_request']['html_url'], + 'number': payload['pull_request']['number'], + 'target_branch': payload['pull_request']['head']['ref'], + 'base_branch': payload['pull_request']['base']['ref'], + 'title': payload['pull_request']['title'] if include_title else None, + 'assignee': assignee['login'] if assignee else None + } + + if payload['pull_request']['merged']: + data['user_name'] = payload['pull_request']['merged_by']['username'] + data['action'] = 'merged' + + return get_pull_request_event_message(**data) + +def format_issues_event(payload: Dict[str, Any], include_title: Optional[bool]=False) -> str: + issue_nr = payload['issue']['number'] + assignee = payload['issue']['assignee'] + return get_issue_event_message( + payload['sender']['login'], + payload['action'], + get_issue_url(payload['repository']['html_url'], issue_nr), + issue_nr, + payload['issue']['body'], + assignee=assignee['login'] if assignee else None, + title=payload['issue']['title'] if include_title else None + ) + +def format_issue_comment_event(payload: Dict[str, Any], include_title: Optional[bool]=False) -> str: + action = payload['action'] + comment = payload['comment'] + issue = payload['issue'] + issue_nr = issue['number'] + + if action == 'created': + action = '[commented]' + else: + action = '{} a [comment]'.format(action) + action += '({}) on'.format(comment['html_url']) + + return get_issue_event_message( + payload['sender']['login'], + action, + get_issue_url(payload['repository']['html_url'], issue_nr), + issue_nr, + comment['body'], + title=issue['title'] if include_title else None + ) + +@api_key_only_webhook_view('Gitea') +@has_request_variables +def api_gitea_webhook(request: HttpRequest, user_profile: UserProfile, + payload: Dict[str, Any]=REQ(argument_type='body'), + branches: Optional[str]=REQ(default=None), + user_specified_topic: Optional[str]=REQ("topic", default=None)) -> HttpResponse: + + repo = payload['repository']['name'] + event = validate_extract_webhook_http_header(request, 'X_GITEA_EVENT', 'Gitea') + if event == 'push': + branch = payload['ref'].replace('refs/heads/', '') + if branches is not None and branch not in branches.split(','): + return json_success() + body = format_push_event(payload) + topic = TOPIC_WITH_BRANCH_TEMPLATE.format( + repo=repo, + branch=branch + ) + elif event == 'create': + body = format_new_branch_event(payload) + topic = TOPIC_WITH_BRANCH_TEMPLATE.format( + repo=repo, + branch=payload['ref'] + ) + elif event == 'pull_request': + body = format_pull_request_event( + payload, + include_title=user_specified_topic is not None + ) + topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( + repo=repo, + type='PR', + id=payload['pull_request']['id'], + title=payload['pull_request']['title'] + ) + elif event == 'issues': + body = format_issues_event( + payload, + include_title=user_specified_topic is not None + ) + topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( + repo=repo, + type='Issue', + id=payload['issue']['number'], + title=payload['issue']['title'] + ) + elif event == 'issue_comment': + body = format_issue_comment_event( + payload, + include_title=user_specified_topic is not None + ) + topic = TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format( + repo=repo, + type='Issue', + id=payload['issue']['number'], + title=payload['issue']['title'] + ) + else: + raise UnexpectedWebhookEventType('Gitea', event) + + check_send_webhook_message(request, user_profile, topic, body) + return json_success()