From 5d508944308329a36c7b905e05e98dec46dadcfd Mon Sep 17 00:00:00 2001 From: cfdaily Date: Mon, 8 Jun 2026 23:22:36 +0800 Subject: [PATCH] auto-sync: 2026-06-08 23:22:36 --- src/api/toolchain_routes.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/api/toolchain_routes.py b/src/api/toolchain_routes.py index 864f3e2..f54ac4d 100644 --- a/src/api/toolchain_routes.py +++ b/src/api/toolchain_routes.py @@ -258,7 +258,12 @@ async def _handle_pull_request(payload: Dict[str, Any]) -> None: async def _handle_pull_request_review(payload: Dict[str, Any]) -> None: - """处理 pull_request_review 事件:非 COMMENTED → 通知 PR 作者。""" + """处理 pull_request_review 事件:非 COMMENTED → 通知 PR 作者。 + + 支持两种 payload 格式: + - repo webhook: review.state = "APPROVED" / "REQUEST_CHANGES" + - org webhook (Gitea v1.23.4): review.type = "pull_request_review_approved" / "pull_request_review_rejected" + """ review = payload.get("review") if not review or not isinstance(review, dict): logger.warning("pull_request_review event missing review field, skipping") @@ -267,7 +272,18 @@ async def _handle_pull_request_review(payload: Dict[str, Any]) -> None: if not pr or not isinstance(pr, dict): logger.warning("pull_request_review event missing pull_request field, skipping") return + + # 兼容两种 payload 格式提取 state state = review.get("state", "") + if not state: + # org webhook 格式:review.type = "pull_request_review_approved" + review_type = review.get("type", "") + type_map = { + "pull_request_review_approved": "APPROVED", + "pull_request_review_rejected": "REQUEST_CHANGES", + "pull_request_review_comment": "COMMENTED", + } + state = type_map.get(review_type, "") # 只通知 APPROVED 和 REQUEST_CHANGES,跳过 COMMENTED 和其他状态 if state == "COMMENTED": @@ -277,8 +293,9 @@ async def _handle_pull_request_review(payload: Dict[str, Any]) -> None: pr_number = pr.get("number", 0) pr_title = pr.get("title", "") pr_author = pr.get("user", {}).get("login", "unknown") - reviewer = review.get("user", {}).get("login", "unknown") - review_body = review.get("body", "(无评论)") + # 兼容:org webhook 的 review 没有 user,从 sender 取 + reviewer = review.get("user", {}).get("login", "") or payload.get("sender", {}).get("login", "unknown") + review_body = review.get("body", "") or review.get("content", "(无评论)") result_map = {"APPROVED": "通过 ✓", "REQUEST_CHANGES": "驳回 ✗"} if state not in result_map: