runbot/runbot/controllers/hook.py
Xavier-Do 435ac449f5 [FIX] runbot: various fixes and ref
- clean thread username
- allow to write on params for debug (was mainly usefull to forbid it
at the beginning)
- imrpove some guidelines about method and actions naming/ ordering
- move some code for a cleaner organisation.
- remove some useless request.env.user (not useful anymore)
2023-09-25 10:52:16 +02:00

53 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
import time
import json
import logging
from odoo import http
from odoo.http import request
_logger = logging.getLogger(__name__)
class Hook(http.Controller):
@http.route(['/runbot/hook', '/runbot/hook/<int:remote_id>'], type='http', auth="public", website=True, csrf=False, sitemap=False)
def hook(self, remote_id=None, **_post):
event = request.httprequest.headers.get("X-Github-Event")
payload = json.loads(request.params.get('payload', '{}'))
if remote_id is None:
repo_data = payload.get('repository')
if repo_data:
remote_domain = [
'|', '|', '|',
('name', '=', repo_data['ssh_url']),
('name', '=', repo_data['ssh_url'].replace('.git', '')),
('name', '=', repo_data['clone_url']),
('name', '=', repo_data['clone_url'].replace('.git', '')),
]
remote = request.env['runbot.remote'].sudo().search(
remote_domain, limit=1)
remote_id = remote.id
if not remote_id:
_logger.error("Remote %s not found", repo_data['ssh_url'])
remote = request.env['runbot.remote'].sudo().browse(remote_id)
# force update of dependencies too in case a hook is lost
if not payload or event == 'push':
remote.repo_id._set_hook_time(time.time())
elif event == 'pull_request':
pr_number = payload.get('pull_request', {}).get('number', '')
branch = request.env['runbot.branch'].sudo().search([('remote_id', '=', remote.id), ('name', '=', pr_number)])
branch._recompute_infos(payload.get('pull_request', {}))
if payload.get('action') in ('synchronize', 'opened', 'reopened'):
remote.repo_id._set_hook_time(time.time())
# remaining recurrent actions: labeled, review_requested, review_request_removed
elif event == 'delete':
if payload.get('ref_type') == 'branch':
branch_ref = payload.get('ref')
_logger.info('Branch %s in repo %s was deleted', branch_ref, remote.repo_id.name)
branch = request.env['runbot.branch'].sudo().search([('remote_id', '=', remote.id), ('name', '=', branch_ref)])
branch.alive = False
return ""