【架构优化】从 gitwork.RecordBaseline 中拆出基线候选回退 resolveBaselineSHA 与提交解析 resolveCommitSHA

未關閉
#447 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

@fx-kurumi 已經在處理了。

開始於 2026年11月13日。

  • #448 來自 @fx-kurumi —— 未關閉

評估

難度
3/5
預估耗時
半天
新手友好度
25/100
Issue 類型
重構
描述清晰度
基本清楚
活躍度
停滯
技術堆疊
git, go
領域
devtools

研究方向

The work is in internal/gitwork/patch.go: read RecordBaseline and the inline resolve closure, then check the existing TestRecordBaseline* tests before extracting resolveCommitSHA and resolveBaselineSHA. Pull request #448 is already open against this issue, so coordinate with it before starting. Done means the existing tests pass unchanged and the new baseline_resolve_test.go covers the fallback order.

由索引模型根據 Issue 內容生成。

描述

现状问题

internal/gitwork/patch.go 中的 RecordBaseline 约 72 行,混合了三件事:

  1. .git / 基线文件的安全检查(Lstat、拒绝符号链接);
  2. 一个内联闭包 resolve(通过 stdin 把 ref 交给 git cat-file --batch-check,解析 commit SHA);
  3. 四级候选回退链 origin/<base> → origin/master → origin/main → HEAD,用一串 if err != nil 逐级尝试,另外还有 []byte/string 来回转换和一处 bytes.TrimSpace(sha) 冗余判断(resolve 成功时 sha 必为合法对象 ID,不可能为空)。

闭包和回退链无法单独测试,也让主函数的“检查 → 解析 → 写文件”流程不够直观。

重构方案

  • 把闭包提为包级函数 resolveCommitSHA(workspace, ref string) (string, error),逻辑与报错文字逐字不变(仍拒绝含 \r/\n 的 ref,ref 仍经 stdin 传给 git)。
  • 新增 resolveBaselineSHA(workspace, baseBranch string) (string, error):按原顺序构造候选列表并依次尝试,全部失败时返回最后一个候选(HEAD)的错误,与原实现一致。
  • RecordBaseline 改为调用 resolveBaselineSHA,外层错误包装 resolve repository baseline: %w 不变。

影响范围

仅 internal/gitwork/patch.go 一个文件;RecordBaseline 签名与行为不变,调用方(internal/runner/daemon.go、internal/engine/repository_workspace.go)无需改动。新增测试文件 internal/gitwork/baseline_resolve_test.go。

验证方式

  • gofmt、go vet ./internal/gitwork/、go build ./...
  • go test ./internal/gitwork/:既有 TestRecordBaseline*(诊断信息、符号链接拒绝、已冻结保留、远程基础分支、分支名不被当作 git 参数)全部通过;新增测试覆盖多行 ref 拒绝、SHA 解析、回退顺序(空/空白/不存在分支 → origin/main)、无远程时回退 HEAD、全部失败时报告最后候选错误。
主要語言
Go
星號
141
分支
28
平均合併
1 天 15 小時
30 天內合併 PR
113

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

Tencent/LoopForge 的其他 Issue

查看 Tencent/LoopForge 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。