2016-03-13 15:14:29 +01:00
|
|
|
# Webhooks for external integrations.
|
2017-11-16 00:43:10 +01:00
|
|
|
from typing import Dict
|
|
|
|
|
2016-06-05 23:42:30 +02:00
|
|
|
from django.http import HttpRequest, HttpResponse
|
|
|
|
|
2020-08-20 00:32:15 +02:00
|
|
|
from zerver.decorator import webhook_view
|
2017-10-31 04:25:48 +01:00
|
|
|
from zerver.lib.request import REQ, has_request_variables
|
2017-11-16 00:43:10 +01:00
|
|
|
from zerver.lib.response import json_success
|
|
|
|
from zerver.lib.validator import check_bool, check_dict, check_string
|
2020-01-14 22:06:24 +01:00
|
|
|
from zerver.lib.webhooks.common import check_send_webhook_message
|
2017-05-02 01:00:50 +02:00
|
|
|
from zerver.models import UserProfile
|
2016-03-13 15:14:29 +01:00
|
|
|
|
2017-03-06 05:56:36 +01:00
|
|
|
GOOD_STATUSES = ['Passed', 'Fixed']
|
2019-01-26 23:24:30 +01:00
|
|
|
BAD_STATUSES = ['Failed', 'Broken', 'Still Failing', 'Errored', 'Canceled']
|
2020-05-20 10:43:07 +02:00
|
|
|
PENDING_STATUSES = ['Pending']
|
2017-03-06 05:56:36 +01:00
|
|
|
|
2021-02-12 03:52:14 +01:00
|
|
|
MESSAGE_TEMPLATE = """\
|
|
|
|
Author: {}
|
|
|
|
Build status: {} {}
|
|
|
|
Details: [changes]({}), [build log]({})"""
|
2016-03-13 15:14:29 +01:00
|
|
|
|
2020-08-20 00:32:15 +02:00
|
|
|
@webhook_view('Travis')
|
2016-03-13 15:14:29 +01:00
|
|
|
@has_request_variables
|
2017-12-19 18:50:49 +01:00
|
|
|
def api_travis_webhook(request: HttpRequest, user_profile: UserProfile,
|
|
|
|
ignore_pull_requests: bool = REQ(validator=check_bool, default=True),
|
2020-06-21 03:25:24 +02:00
|
|
|
message: Dict[str, object]=REQ('payload', validator=check_dict([
|
2016-06-03 20:21:57 +02:00
|
|
|
('author_name', check_string),
|
|
|
|
('status_message', check_string),
|
|
|
|
('compare_url', check_string),
|
2017-12-19 18:50:49 +01:00
|
|
|
]))) -> HttpResponse:
|
2017-03-06 05:56:36 +01:00
|
|
|
|
|
|
|
message_status = message['status_message']
|
2017-03-06 07:12:40 +01:00
|
|
|
if ignore_pull_requests and message['type'] == 'pull_request':
|
|
|
|
return json_success()
|
2017-03-06 05:56:36 +01:00
|
|
|
|
|
|
|
if message_status in GOOD_STATUSES:
|
2018-02-07 03:26:08 +01:00
|
|
|
emoji = ':thumbs_up:'
|
2017-03-06 05:56:36 +01:00
|
|
|
elif message_status in BAD_STATUSES:
|
2018-02-07 03:26:08 +01:00
|
|
|
emoji = ':thumbs_down:'
|
2020-05-20 10:43:07 +02:00
|
|
|
elif message_status in PENDING_STATUSES:
|
2020-05-29 00:02:30 +02:00
|
|
|
emoji = ':counterclockwise:'
|
2016-03-13 15:14:29 +01:00
|
|
|
else:
|
2020-06-09 00:25:09 +02:00
|
|
|
emoji = f"(No emoji specified for status '{message_status}'.)"
|
2017-03-06 05:56:36 +01:00
|
|
|
|
|
|
|
body = MESSAGE_TEMPLATE.format(
|
|
|
|
message['author_name'],
|
|
|
|
message_status,
|
|
|
|
emoji,
|
|
|
|
message['compare_url'],
|
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
|
|
|
message['build_url'],
|
2017-03-06 05:56:36 +01:00
|
|
|
)
|
2018-03-16 22:53:50 +01:00
|
|
|
topic = 'builds'
|
2016-03-13 15:14:29 +01:00
|
|
|
|
2018-03-16 22:53:50 +01:00
|
|
|
check_send_webhook_message(request, user_profile, topic, body)
|
2016-03-13 15:14:29 +01:00
|
|
|
return json_success()
|