【架构优化】拆分 runner.collectTaskOutputs 的输出文件读取、补丁目录推导与补丁采集

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

維護者通常 1 天內回覆

@fx-kurumi 已經在處理了。

開始於 2026年11月13日。

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

評估

難度
2/5
預估耗時
1-3 小時
新手友好度
22/100
Issue 類型
重構
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
git, go
領域
devtools

研究方向

Work is confined to internal/runner/outputs.go, where collectTaskOutputs mixes file reading, patch-directory derivation and patch collection. The payload names no entry point beyond that function. Done means three helpers are extracted with unchanged behaviour, the existing TestCollectTaskOutputsReportsOnlyRegularFilesInsideWorkspace still passes, and new tests cover the extracted pieces. However, a linked pull request (#432) is already open, so the work is likely claimed.

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

描述

现状问题

internal/runner/outputs.go 的 collectTaskOutputs 约 50 行,在一个函数里串行做了三件互不相关的事:

  1. 逐个读取 OutputFiles(路径安全校验、Lstat 只认普通文件、超过 maxArtifactUploadBytes 记入 TooLarge、读入 Files);
  2. 推导需要采集补丁清单的仓库目录(无仓库时为工作区根 "",否则为各仓库的 safeRunnerRepoDir(WorkspaceDir)),并逐个调用 gitwork.PatchInventory 填 Patches;
  3. 检测前端工作区事实 Facts。

其中「仓库目录推导」是纯逻辑却埋在 I/O 循环里,无法单独测试;现有测试也只覆盖了第 1 步。

重构方案

仅在 internal/runner/outputs.go 内拆函数,不改逻辑:

  • readOutputFiles(workspace, rels) (files map[string]string, tooLarge []string):原第 1 段循环原样搬入;
  • patchInventoryDirs(inv) []string:原目录推导原样搬入;
  • collectPatchInventories(workspace, dirs) map[string]string:原补丁采集循环原样搬入;
  • collectTaskOutputs 只负责编排:恢复缺失输出 → 读文件 → 采补丁 → 采事实。

nil map / nil slice 的语义保持不变(没有文件时 Files/Patches 仍为 nil,JSON omitempty 输出不变)。

影响范围

仅 internal/runner/outputs.go(及新增测试文件),collectTaskOutputs 签名与三个调用方(daemon.go)不变,对外接口与行为不变。

验证方式

  • 新增测试覆盖 patchInventoryDirs(无仓库 / 多仓库)、collectPatchInventories(真实 git 仓库有改动 / 无改动 / 非仓库目录)与 readOutputFiles 的 nil 语义;
  • 原有 TestCollectTaskOutputsReportsOnlyRegularFilesInsideWorkspace 不改动且通过;
  • gofmt、go vet ./internal/runner/、go test ./internal/runner/。
主要語言
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 摘要。