git workspace逻辑

This commit is contained in:
2026-06-10 16:06:55 +08:00
parent 023ab2f30e
commit c6f239f424
4 changed files with 70 additions and 2 deletions
+7 -1
View File
@@ -23,7 +23,13 @@ func (e *GitError) Error() string {
for i, a := range e.Args {
redacted[i] = redactURLUserinfo(a)
}
return fmt.Sprintf("git %v: exit %d: %s", redacted, e.ExitCode, e.Stderr)
// stderr 为空说明进程多半没跑起来(chdir 失败、二进制缺失、超时被 kill),
// 此时 Cause 才是唯一有效信息,不能丢。
detail := e.Stderr
if detail == "" && e.Cause != nil {
detail = e.Cause.Error()
}
return fmt.Sprintf("git %v: exit %d: %s", redacted, e.ExitCode, detail)
}
// redactURLUserinfo 剥离形如 scheme://user[:pass]@host 中的 userinfo,
+14
View File
@@ -54,6 +54,20 @@ func TestDefaultRunner_exec_Timeout(t *testing.T) {
require.Error(t, err)
}
func TestGitError_Error_EmptyStderrFallsBackToCause(t *testing.T) {
// 进程没跑起来时(chdir 失败 / 二进制缺失)stderr 为空,Error() 必须带上
// Cause,否则落库的 last_sync_error 只剩 "exit -1: " 无法定位。
t.Parallel()
ge := &GitError{Args: []string{"fetch"}, ExitCode: -1,
Cause: errors.New("chdir /data/x: no such file or directory")}
require.Contains(t, ge.Error(), "no such file or directory")
// stderr 非空时仍以 stderr 为准,不重复拼 Cause。
ge2 := &GitError{Args: []string{"fetch"}, ExitCode: 128,
Stderr: "fatal: boom", Cause: errors.New("exit status 128")}
require.Contains(t, ge2.Error(), "fatal: boom")
require.NotContains(t, ge2.Error(), "exit status 128")
}
func TestIsAuthError(t *testing.T) {
t.Parallel()
cases := []struct {