Merged
refactor(api): extract decodeAPIError helper, eliminate 6x error decoding duplication #361
luojiyinAdd on Jul 8
refactor(api): extract decodeAPIError helper, eliminate 6x error decoding duplication #361
Merged
Merged fromluojiyin87/clirefactor/decode-api-errorintoatomgit-cli/climain
Pull Request has been successfully merged by aflyingto.
(Thank you for luojiyin's contribution.)aflyingto
Jul 27 Comments:
Jul 27 Comments:
独立评审报告
- 评审主体类型: 独立 AI 评审代理
- 评审主体标识: opencode (glm-5.2),与作者 luojiyin87 为不同执行主体
- 评审范围: PR !361 refactor(api): extract decodeAPIError helper(head
7aa15a4,basee00d90a) - 关联 issue: #421(提取 decodeAPIError,消除 6 处错误解码重复)
- 评审方法: 不信任原则 — 独立 fetch + 模拟 merge + 本地验证 + CI
- 结论: APPROVED(0 P0 / 1 P1 / 3 P2),可 merge,P1 通过 merge 后手动关闭 issue 解决
代码层面核验
decodeAPIError(respBody, statusCode, status)提取正确,逻辑与原 6 处一致(json.Unmarshal+ 4 字段检查 +StatusCode设置 + fallbackAPIError{StatusCode, Message:status})- 替换 6 处全部核验:
REST、RawREST、GetText、PostForm、PatchForm、UploadAsset(每处从 ~6 行块替换为单行return decodeAPIError(...)) - 无行为变更:函数签名、返回值类型、错误语义与原实现完全一致
本地验证(模拟 merge 到 main 后)
$ go test ./api/... -run TestDecodeAPIError -count=1 -v
TestDecodeAPIError/message_field PASS
TestDecodeAPIError/error_message_field PASS
TestDecodeAPIError/error_field PASS
TestDecodeAPIError/error_code_name_field PASS
TestDecodeAPIError/non-JSON_body_returns_generic_error PASS
TestDecodeAPIError/JSON_but_no_error_fields PASS
TestDecodeAPIError/multiple_error_fields PASS
$ go test ./api/... -count=1 → PASS
$ go vet ./api/... → clean
$ gofmt -l api/ → clean
CI 验证
GitHub Actions run ID: 30245860980(github.com/gitcode-cli/cli CI mirror,评审者为 fork PR 触发)
- conclusion: success(8 Job 全绿)
P1 阻塞(影响 issue 状态机收敛,非代码问题)
- P1 PR body close 关键字格式不对 — body 用
close [#421](https://gitcode.com/.../issues/421)(小写close+ markdown 链接[#421](url)),非规范要求的Closes #421(裸#NNN)。GitCode 对 markdown 链接文本里的#NNN不触发自动关闭,merge 后 issue #421 不会自动关闭。- 处置:评审者 merge 后手动关闭 issue #421(
gc issue close 421 --yes),或作者在 merge 前将 body 改为Closes #421
- 处置:评审者 merge 后手动关闭 issue #421(
P2 非阻塞
- P2 风险自检不准确 — 作者自检称 risk 未明示但 Test Plan 段无风险分级;
classify-change-risk.py --base origin/main输出risk=medium(client.go + client_test.go runtime path)。PR 标签缺失,需补risk/medium。 - P2 PR 无任何标签 — 未进状态机。需补:
type/refactor、scope/api、risk/medium、status/ready-for-review。 - P2 PR body 非完整自检 — body 是摘要式(变更内容/问题/修改文件/测试),缺规范要求的作者主体标识/根因/未覆盖项/安全审查/文档同步段。issue #421 也无标签。
总结
纯重构无行为变更,代码层面 APPROVED(decodeAPIError 提取正确 + 7 测试覆盖 + CI 绿 + vet/fmt clean)。P1 close 格式通过 merge 后手动关 issue 解决。可进入 merge。
merge 后:
- 手动关闭 issue #421(close 格式不触发自动关闭)
- 清理 GitHub 镜像仓临时 PR #78 与远程分支
refactor/decode-api-error - 注意:!364 也改
api/client.go,merge !361 后 !364 需 rebase 到最新 main


变更内容
decodeAPIError(respBody, statusCode, status) error方法,统一 API 错误解码逻辑REST、RawREST、GetText、PostForm、PatchForm、UploadAsset问题
api/client.go中错误解码逻辑(检查Message/ErrorMessage/ErrorName/ErrorCodeName)被复制粘贴 6 次,修改时容易遗漏。修改文件
api/client.godecodeAPIError方法,替换 6 处重复块api/client_test.goTestDecodeAPIError用例测试
go build ./...✅go test ./api/...(225 passed) ✅go vet ./api/...✅close #421