Documentation
¶
Overview ¶
Package gitops 封裝所有 git 操作,根據 workspace config 決定 monorepo 或 multi-repo 模式。
Index ¶
- func Branch(featureID string) string
- func CopyFileIfExists(src, dst string) error
- func CopyFileIfNewer(src, dst string) (copied bool, err error)
- func CountFileLines(path string) int
- func Dir(root, featureID string) string
- func ParseNumstatCount(s string) int
- func ScopeRoot(fallback, featureID string) string
- type MergeResult
- type Ops
- type WorktreeInfo
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func CopyFileIfExists ¶
CopyFileIfExists 複製檔案,來源不存在時靜默忽略(回 nil);讀寫失敗回傳 error。供外部 package 使用。
func CopyFileIfNewer ¶
CopyFileIfNewer 僅在來源比目標新(或目標不存在)時複製,用於差量化 worktree sync, 避免每輪 final sync 與每 2 秒 live-sync 對未變更檔案重複全量複製。 回傳是否實際複製、以及錯誤;來源不存在視為靜默成功(false, nil)。 比對採 mtime-only:dst 不存在則複製;兩者皆存在時 srcInfo.ModTime().After(dstInfo.ModTime()) 才複製。
func CountFileLines ¶ added in v0.3.1
CountFileLines 回傳檔案的行數(以 '\n' 計),讀檔失敗回 0。 末行無換行時補計 1 行,使單行無換行的檔案計為 1 而非 0。
func ParseNumstatCount ¶ added in v0.3.1
ParseNumstatCount 解析 numstat 的 added/deleted 欄位,binary 檔的 "-" 視為 0。
Types ¶
type MergeResult ¶
type MergeResult struct {
Skipped bool
Conflict bool
Error string
Files []string
ConflictRepo string
StateChanged bool
FinalState protocol.State
}
MergeResult 描述 Merge 操作的結果。
StateChanged 與 FinalState 由 MergeAndFinalize 在 merge 後填入:StateChanged 表 merge 期間 state.json 的 phase 已非 pending-review(未 finalize),FinalState 為成功 finalize 後寫入的最新 state (或 StateChanged 時偵測到的當下 state)。Merge 本身不設定這兩個欄位。
func MergeAndFinalize ¶ added in v0.2.4
func MergeAndFinalize(root string, ws *protocol.Workspace, cfg protocol.Config, featureID, featureName string) (MergeResult, error)
MergeAndFinalize 承載 CLI(cmd/4x/done.go autoMergeFeature)與 server (internal/server/server.go handlePostDone)原本各自實作的 merge+done 編排,是兩端共用的 唯一真實來源:ops.Merge → merge 成功時重讀最新 state 確認仍為 pending-review → state.FinalizeDone → learning.CommitIfDirty。
重讀 state 是為了保留 server 的防 stale 覆寫不變式:merge 可能耗時數秒,期間 runner 或 ensureInactive 可能改過 state.json,若用 merge 前的 stale 值 finalize 會覆蓋其他欄位更新。 CLI 單程序下沒有並行 writer,重讀為 no-op,安全。
結果以回傳值的組合表達,讓 CLI 與 server 各自決定後續:
- (MergeResult{Conflict:true}, nil) → merge 衝突,未 finalize,呼叫端維持 pending-review
- (MergeResult{Error:!=""}, nil) → 非衝突 merge 錯誤,未 finalize,呼叫端警告並維持 pending-review
- (MergeResult{StateChanged:true}, nil) → merge 後 phase 已非 pending-review,未 finalize(server 回 409)
- (result, err) err!=nil → 重讀 state 或 finalize 真正失敗(fatal,server 回 500)
- (MergeResult{FinalState:done}, nil) → 成功 finalize 為 done,Skipped 表非 worktree 模式
並行鎖(server 的 mergeMu)由呼叫端負責包住本函式;CLI 單程序無需鎖,本函式不持鎖。
type Ops ¶
type Ops interface {
SetupWorktree(featureID string, featureRepos []string) (wtRoot string, err error)
Commit(wtRoot, featureID, msg string) error
Merge(featureID, featureName string) MergeResult
Cleanup(featureID string) error
DetectChangedRepos(featureID string) []string
DetectChangedFiles(featureID string) []protocol.ChangedFile
CaptureBaseline(featureID string, featureRepos []string) error
IsMultiRepo() bool
}
Ops 封裝所有 git 操作,根據 workspace config 決定 monorepo 或 multi-repo 模式。
type WorktreeInfo ¶ added in v0.1.13
type WorktreeInfo struct {
// Root 是該目錄所屬 worktree 的 top-level 根目錄(git rev-parse --show-toplevel)。
Root string
// IsLinked 為 true 表示這是 git worktree add 產生的 linked worktree;
// false 表示主工作區(main working tree)。
IsLinked bool
}
WorktreeInfo 描述某個目錄所屬的 git worktree 狀態。
func DetectWorktree ¶ added in v0.1.13
func DetectWorktree(dir string) (WorktreeInfo, bool)
DetectWorktree 偵測 dir 所屬的 git worktree,回傳其 top-level 根目錄與是否為 linked worktree。
scope 檢查在 worktree 隔離模式下,git 操作的根目錄會被解析到 main workspace, 導致誤把 main 的未提交變更算進 feature 的 changed repos。此 helper 讓呼叫端能 把 git 操作限定在 worktree 自身的根目錄。
判定方式:以 git rev-parse --git-dir 與 --git-common-dir 是否相異判定是否為 linked worktree(linked worktree 的 git-dir 指向 <common>/.git/worktrees/<name>,與 common dir 不同)。dir 不在 git repo 內時回傳 ok=false。