cli:修正帶旗標命令被全域剖析攔下的阻斷問題(#13 審核)

- parseGlobals 改為抽取式 extractGlobals:只取走已知全域選項,非全域
  選項(--has-work/--mine/--reviewer/--repo)原樣交回子命令 flagset,
  任何順序(含與全域選項交錯)皆可解析;-- 之後停止抽取。
- runVersion 補參數檢查:version --wat 仍回 exit 2。
- workflow:commentsFor 對 number<=0 視為無留言,不打 API(對齊 gitea.py
  在 number 缺漏時跳過留言檢查,避免 issues/0/comments 404 中斷掃描)。
- 新增 internal/cli/workflow_commands_test.go:以注入假 client 的接線層
  測試補上 workflow 單元測試覆蓋不到的分派路徑(members --has-work、
  pulls --mine/--reviewer/--repo、全域選項交錯、next null/table)。
- README:註明與 gitea.py 的已知輸出差異(空清單 [] vs 無輸出;
  全域選項可出現在命令前後)。

實機交叉驗證(alex):members --has-work、pulls --mine/--reviewer、
pulls --repo、next、mine 兩者輸出一致;go vet/test 全綠。
This commit is contained in:
2026-09-10 09:41:53 +08:00
parent 5583a00bb5
commit 927855d3ca
6 changed files with 403 additions and 72 deletions
+11 -6
View File
@@ -30,6 +30,11 @@ func init() {
// errNoRepoFlag 是 --repo 值格式錯誤。
var errNoRepoFlag = errors.New("--repo 需為 owner/repo 形式")
// newScannerFunc 建立工作流 Scanner;正式環境用 API client。
// 宣告為變數讓接線層測試可注入假 client(不走網路),
// 彌補 workflow 套件單元測試覆蓋不到 CLI 分派路徑的缺口。
var newScannerFunc = newWorkflowClient
// newWorkflowClient 依全域選項建立 workflow 所需的 API client。
func newWorkflowClient(env *Env) (*workflow.Scanner, error) {
token, _, err := gitea.ResolveToken(gitea.AuthOptions{
@@ -57,7 +62,7 @@ func runWhoami(env *Env, args []string) error {
if len(args) != 0 {
return &ErrUsage{Msg: "whoami 不接受參數"}
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}
@@ -76,7 +81,7 @@ func runOrgs(env *Env, args []string) error {
if len(args) != 0 {
return &ErrUsage{Msg: "orgs 不接受參數"}
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}
@@ -105,7 +110,7 @@ func runMembers(env *Env, args []string) error {
if fs.NArg() != 0 {
return &ErrUsage{Msg: "members 不接受位置參數"}
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}
@@ -125,7 +130,7 @@ func runMine(env *Env, args []string) error {
if len(args) != 0 {
return &ErrUsage{Msg: "mine 不接受參數"}
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}
@@ -165,7 +170,7 @@ func runPulls(env *Env, args []string) error {
}
owner, name = parts[0], parts[1]
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}
@@ -198,7 +203,7 @@ func runNext(env *Env, args []string) error {
if len(args) != 0 {
return &ErrUsage{Msg: "next 不接受參數"}
}
s, err := newWorkflowClient(env)
s, err := newScannerFunc(env)
if err != nil {
return err
}