You've already forked agentic-coding-workflow
56 lines
1.6 KiB
Go
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()})
|
|
}
|