From 9398f6c6e3f0ed71a43155e62def6cef8a0cf851 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 7 Jun 2026 22:17:49 +0800 Subject: [PATCH] auto-sync: 2026-06-07 22:17:49 --- src/api/toolchain_routes.py | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/api/toolchain_routes.py b/src/api/toolchain_routes.py index 9c6ccec..89d9c1a 100644 --- a/src/api/toolchain_routes.py +++ b/src/api/toolchain_routes.py @@ -224,7 +224,10 @@ async def _handle_pull_request(payload: Dict[str, Any]) -> None: if action != "opened": return - pr = payload.get("pull_request") or {} + pr = payload.get("pull_request") + if not pr or not isinstance(pr, dict): + logger.warning("pull_request event missing pull_request field, skipping") + return repo = _repo_fullname(payload) pr_number = pr.get("number", 0) pr_title = pr.get("title", "") @@ -252,14 +255,20 @@ 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 作者。""" - review = payload.get("review") or {} + review = payload.get("review") + if not review or not isinstance(review, dict): + logger.warning("pull_request_review event missing review field, skipping") + return + pr = payload.get("pull_request") + if not pr or not isinstance(pr, dict): + logger.warning("pull_request_review event missing pull_request field, skipping") + return state = review.get("state", "") # 只通知 APPROVED 和 REQUEST_CHANGES,跳过 COMMENTED 和其他状态 if state == "COMMENTED": return - pr = payload.get("pull_request") or {} repo = _repo_fullname(payload) pr_number = pr.get("number", 0) pr_title = pr.get("title", "") @@ -288,7 +297,10 @@ async def _handle_pull_request_review(payload: Dict[str, Any]) -> None: async def _handle_issues(payload: Dict[str, Any]) -> None: """处理 issues 事件:assigned → 通知被指派人;opened+部署失败 → 通知运维。""" action = payload.get("action", "") - issue = payload.get("issue") or {} + issue = payload.get("issue") + if not issue or not isinstance(issue, dict): + logger.warning("issues event missing issue field, skipping") + return repo = _repo_fullname(payload) issue_number = issue.get("number", 0) issue_title = issue.get("title", "") @@ -296,8 +308,14 @@ async def _handle_issues(payload: Dict[str, Any]) -> None: if action == "assigned": assignee = "" assignees = issue.get("assignees") or [] + if not assignees: + single = issue.get("assignee") + if single and isinstance(single, dict): + assignees = [single] if assignees: assignee = assignees[-1].get("login", "") + else: + assignee = "" if not assignee: logger.debug("Issue assigned but no assignee found, skipping") return @@ -336,14 +354,20 @@ async def _handle_issues(payload: Dict[str, Any]) -> None: async def _handle_issue_comment(payload: Dict[str, Any]) -> None: """处理 issue_comment 事件:CI 失败关键词 → 通知 PR 作者。""" - comment = payload.get("comment") or {} + comment = payload.get("comment") + if not comment or not isinstance(comment, dict): + logger.warning("issue_comment event missing comment field, skipping") + return body = comment.get("body", "") # 检查是否包含 CI 失败关键词 if "[CI]" not in body and "CI 失败" not in body: return - issue = payload.get("issue") or {} + issue = payload.get("issue") + if not issue or not isinstance(issue, dict): + logger.warning("issue_comment event missing issue field, skipping") + return repo = _repo_fullname(payload) issue_number = issue.get("number", 0)