Package coprs :: Package views :: Package webhooks_ns :: Module webhooks_general
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.webhooks_ns.webhooks_general

  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"]) 
23 -def webhooks_git_push(copr_id, uuid):
24 if flask.request.headers["X-GitHub-Event"] == "ping": 25 return "OK", 200 26 # For the documentation of the data we receive see: 27 # https://developer.github.com/v3/activity/events/types/#pushevent 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"])
63 -def webhooks_gitlab_push(copr_id, uuid):
64 # For the documentation of the data we receive see: 65 # https://gitlab.com/help/user/project/integrations/webhooks#events 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