You've already forked agentic-coding-workflow
feat(infra/git): Runner interface + Credential injection + GitError
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package git
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// gitAvailable 跳过测试如果 git 不在 PATH。
|
||||
func gitAvailable(t *testing.T) {
|
||||
t.Helper()
|
||||
if _, err := exec.LookPath("git"); err != nil {
|
||||
t.Skip("git not found in PATH")
|
||||
}
|
||||
}
|
||||
|
||||
// makeBareRepo 在 tmpdir 下 init --bare 一个仓库并塞一个初始 commit。
|
||||
// 返回 bare repo 绝对路径(可作为 remote URL 的 file:// 路径)。
|
||||
func makeBareRepo(t *testing.T) string {
|
||||
t.Helper()
|
||||
gitAvailable(t)
|
||||
dir := t.TempDir()
|
||||
bare := filepath.Join(dir, "remote.git")
|
||||
require.NoError(t, exec.Command("git", "init", "--bare", "-b", "main", bare).Run())
|
||||
|
||||
// 用一个 working repo 推一次 commit 进 bare,避免空 remote 导致 clone 报错
|
||||
work := filepath.Join(dir, "seed")
|
||||
require.NoError(t, os.MkdirAll(work, 0o755))
|
||||
mustGit(t, work, "init", "-b", "main")
|
||||
mustGit(t, work, "config", "user.email", "test@example.com")
|
||||
mustGit(t, work, "config", "user.name", "Test")
|
||||
require.NoError(t, os.WriteFile(filepath.Join(work, "README.md"), []byte("hello\n"), 0o644))
|
||||
mustGit(t, work, "add", ".")
|
||||
mustGit(t, work, "commit", "-m", "initial")
|
||||
mustGit(t, work, "remote", "add", "origin", bare)
|
||||
mustGit(t, work, "push", "origin", "main")
|
||||
return bare
|
||||
}
|
||||
|
||||
func mustGit(t *testing.T, dir string, args ...string) {
|
||||
t.Helper()
|
||||
c := exec.Command("git", args...)
|
||||
c.Dir = dir
|
||||
out, err := c.CombinedOutput()
|
||||
require.NoError(t, err, "git %v: %s", args, string(out))
|
||||
}
|
||||
|
||||
// newTestRunner 返回挂在 t.TempDir() 的 Runner。
|
||||
func newTestRunner(t *testing.T) *DefaultRunner {
|
||||
t.Helper()
|
||||
return NewDefaultRunner(Config{Binary: "git", TmpDir: t.TempDir()})
|
||||
}
|
||||
Reference in New Issue
Block a user