Files
agentic-coding-workflow/internal/infra/git/testutil_test.go
T

56 lines
1.6 KiB
Go

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()})
}