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

Ouverte
#447 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@fx-kurumi y travaille déjà.

Depuis le 13/11/2026.

  • #448 par @fx-kurumi — ouverte

Évaluation

Difficulté
3/5
Temps estimé
Une demi-journée
Accessibilité débutants
25/100
Type d'issue
Refactorisation
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
git, go
Domaine
devtools

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

现状问题

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、全部失败时报告最后候选错误。
Langage dominant
Go
Étoiles
141
Forks
28
Merge moyen
1 j 15 h
PR mergées (30 j)
113

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de Tencent/LoopForge

Toutes les issues de Tencent/LoopForge

Issues similaires

Plus d'issues Go

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.