| from flask import Flask, request, jsonify |
| from yaml import load, dump |
| from yaml import Loader, Dumper |
| |
| app = Flask(__name__) |
| |
| with open("config.yml") as fp: |
| config = load(fp, Loader=Loader) |
| |
| gh_user_map = config.get("gh-user-map", {}) |
| |
| |
| @app.route('/webhook', methods=['POST']) |
| def webhook_receiver(): |
| payload = request.json |
| event = request.headers.get("X-Github-Event") |
| action = payload.get("action") |
| |
| if event == "pull_request" and action == "enqueued": |
| pr_number = payload.get("number") |
| login = payload.get("sender").get("login") |
| asf_id = gh_user_map.get(login) |
| pull_request = payload.get("pull_request") |
| title = pull_request.get("title") |
| print(f"User {login} (Apache ID {asf_id}) added PR #{pr_number} ({title}) to merge queue.") |
| elif event == "pull_request" and action == "dequeued": |
| pr_number = payload.get("number") |
| reason = payload.get("reason") |
| pull_request = payload.get("pull_request") |
| if reason.lower() == "merge": |
| merge_commit_sha = pull_request.get("merge_commit_sha") |
| title = pull_request.get("title") |
| login = payload.get("sender").get("login") |
| asf_id = gh_user_map.get(login) |
| print(f"User {login} (Apache ID {asf_id}) merged PR #{pr_number} ({title}). Merge SHA is {merge_commit_sha}") |
| elif event == "merge_group" and action == "checks_requested": |
| print("Merge group!!") |
| merge_group = payload.get("merge_group", {}) |
| login = payload.get("sender").get("login") |
| asf_id = gh_user_map.get(login) |
| base = merge_group.get("base_sha") |
| head = merge_group.get("head_sha") |
| print(f"User {login} (Apache ID {asf_id}) merged commits after {base} up until {head} via merge queue") |
| else: |
| print(f"Received webhook event {event} with action {action}") |
| |
| return jsonify({'message': 'Webhook received successfully'}), 200 |
| |
| |
| if __name__ == '__main__': |
| app.run(debug=True, host='localhost', port=3000) |