package git import ( "os" "os/exec" "path/filepath" "strings" "testing" ) func TestInitBare(t *testing.T) { path := filepath.Join(t.TempDir(), "demo.git") if err := InitBare(path, "main"); err != nil { t.Fatalf("InitBare: %v", err) } head, err := os.ReadFile(filepath.Join(path, "HEAD")) if err != nil { t.Fatalf("read HEAD: %v", err) } if !strings.Contains(string(head), "ref: refs/heads/main") { t.Errorf("HEAD = %q, want ref: refs/heads/main", head) } cmd := exec.Command("git", "rev-parse", "--is-bare-repository") cmd.Dir = path if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("rev-parse: %v: %s", err, out) } else if strings.TrimSpace(string(out)) != "true" { t.Errorf("is-bare-repository = %q, want true", out) } } func TestInitBareReportsFailure(t *testing.T) { file := filepath.Join(t.TempDir(), "occupied") if err := os.WriteFile(file, []byte("x"), 0o644); err != nil { t.Fatalf("write file: %v", err) } if err := InitBare(file, "main"); err == nil { t.Error("InitBare over a regular file = nil, want error") } } func TestInitBareInstallsPostReceive(t *testing.T) { path := filepath.Join(t.TempDir(), "demo.git") if err := InitBare(path, "main"); err != nil { t.Fatalf("InitBare: %v", err) } hook := filepath.Join(path, "hooks", "post-receive") info, err := os.Stat(hook) if err != nil { t.Fatalf("stat post-receive: %v", err) } if info.Mode()&0o111 == 0 { t.Error("post-receive is not executable") } script, err := os.ReadFile(hook) if err != nil { t.Fatalf("read post-receive: %v", err) } for _, want := range []string{"SIMPLEGIT_BIN", "hook --repo", "dirname"} { if !strings.Contains(string(script), want) { t.Errorf("post-receive lacks %q: %q", want, script) } } } func TestDefaultBranchRoundTrip(t *testing.T) { path := filepath.Join(t.TempDir(), "demo.git") if err := InitBare(path, "main"); err != nil { t.Fatalf("InitBare: %v", err) } if branch, err := DefaultBranch(path); err != nil || branch != "main" { t.Fatalf("DefaultBranch = %q, %v; want main", branch, err) } if err := SetDefaultBranch(path, "trunk"); err != nil { t.Fatalf("SetDefaultBranch: %v", err) } if branch, err := DefaultBranch(path); err != nil || branch != "trunk" { t.Errorf("DefaultBranch after set = %q, %v; want trunk", branch, err) } }