1 import flask
2
3 from coprs import db, app
4 from coprs import helpers
5
6 from coprs.logic.builds_logic import BuildsLogic
7 from coprs.logic.complex_logic import ComplexLogic
8 from coprs.logic.coprs_logic import CoprsLogic
9 from coprs.logic.packages_logic import PackagesLogic
10
11 from coprs.exceptions import ObjectNotFound, AccessRestricted
12
13 from coprs.views.webhooks_ns import webhooks_ns
14 from coprs.views.misc import page_not_found, access_restricted
15
16 import logging
17 import os
18
19 log = logging.getLogger(__name__)
20
21
22 @webhooks_ns.route("/github/<copr_id>/<uuid>/", methods=["POST"])
24 if flask.request.headers["X-GitHub-Event"] == "ping":
25 return "OK", 200
26
27
28 try:
29 copr = ComplexLogic.get_copr_by_id_safe(copr_id)
30 except ObjectNotFound:
31 return page_not_found("Project does not exist")
32
33 if copr.webhook_secret != uuid:
34 return access_restricted("This webhook is not valid")
35
36 try:
37 payload = flask.request.json
38 clone_url = payload['repository']['clone_url']
39 commits = []
40 payload_commits = payload.get('commits', [])
41 for payload_commit in payload_commits:
42 commits.append({
43 'added': payload_commit['added'],
44 'modified': payload_commit['modified'],
45 'removed': payload_commit['removed'],
46 })
47
48 ref_type = payload.get('ref_type', '')
49 ref = payload.get('ref', '')
50 except KeyError:
51 return "Bad Request", 400
52
53 packages = PackagesLogic.get_for_webhook_rebuild(copr_id, uuid, clone_url, commits, ref_type, ref)
54
55 for package in packages:
56 BuildsLogic.rebuild_package(package, {'committish': os.path.basename(ref)})
57
58 db.session.commit()
59
60 return "OK", 200
61
62 @webhooks_ns.route("/gitlab/<copr_id>/<uuid>/", methods=["POST"])
64
65
66 try:
67 copr = ComplexLogic.get_copr_by_id_safe(copr_id)
68 except ObjectNotFound:
69 return page_not_found("Project does not exist")
70
71 if copr.webhook_secret != uuid:
72 return access_restricted("This webhook is not valid")
73
74 try:
75 payload = flask.request.json
76 clone_url = payload['project']['git_http_url']
77 commits = []
78 payload_commits = payload.get('commits', [])
79 for payload_commit in payload_commits:
80 commits.append({
81 'added': payload_commit['added'],
82 'modified': payload_commit['modified'],
83 'removed': payload_commit['removed'],
84 })
85 if payload['object_kind'] == 'tag_push':
86 ref_type = 'tag'
87 ref = os.path.basename(payload.get('ref', ''))
88 else:
89 ref_type = None
90 ref = payload.get('ref', '')
91 except KeyError:
92 return "Bad Request", 400
93
94 packages = PackagesLogic.get_for_webhook_rebuild(copr_id, uuid, clone_url, commits, ref_type, ref)
95
96 for package in packages:
97 BuildsLogic.rebuild_package(package, {'committish': os.path.basename(ref)})
98
99 db.session.commit()
100
101 return "OK", 200
102