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
25
26 try:
27 copr = ComplexLogic.get_copr_by_id_safe(copr_id)
28 except ObjectNotFound:
29 return page_not_found("Project does not exist")
30
31 if copr.webhook_secret != uuid:
32 return access_restricted("This webhook is not valid")
33
34 try:
35 payload = flask.request.json
36 clone_url = payload['repository']['clone_url']
37 commits = []
38 payload_commits = payload.get('commits', [])
39 for payload_commit in payload_commits:
40 commits.append({
41 'added': payload_commit['added'],
42 'modified': payload_commit['modified'],
43 'removed': payload_commit['removed'],
44 })
45
46 ref_type = payload.get('ref_type', '')
47 ref = payload.get('ref', '')
48 except KeyError:
49 return "Bad Request", 400
50
51 packages = PackagesLogic.get_for_webhook_rebuild(copr_id, uuid, clone_url, commits, ref_type, ref)
52
53 for package in packages:
54 BuildsLogic.rebuild_package(package)
55
56 db.session.commit()
57
58 return "OK", 200
59
60 @webhooks_ns.route("/gitlab/<copr_id>/<uuid>/", methods=["POST"])
62
63
64 try:
65 copr = ComplexLogic.get_copr_by_id_safe(copr_id)
66 except ObjectNotFound:
67 return page_not_found("Project does not exist")
68
69 if copr.webhook_secret != uuid:
70 return access_restricted("This webhook is not valid")
71
72 try:
73 payload = flask.request.json
74 clone_url = payload['project']['git_http_url']
75 commits = []
76 payload_commits = payload.get('commits', [])
77 for payload_commit in payload_commits:
78 commits.append({
79 'added': payload_commit['added'],
80 'modified': payload_commit['modified'],
81 'removed': payload_commit['removed'],
82 })
83 if payload['object_kind'] == 'tag_push':
84 ref_type = 'tag'
85 ref = os.path.basename(payload.get('ref', ''))
86 else:
87 ref_type = None
88 ref = payload.get('ref', '')
89 except KeyError:
90 return "Bad Request", 400
91
92 packages = PackagesLogic.get_for_webhook_rebuild(copr_id, uuid, clone_url, commits, ref_type, ref)
93
94 for package in packages:
95 BuildsLogic.rebuild_package(package)
96
97 db.session.commit()
98
99 return "OK", 200
100