internal/gitutil/fsck_test.go

v1.40.0
gitbay/internal/gitutil/fsck_test.go history · blame · raw

49 lines · 1405 bytes

 1package gitutil
 2
 3import (
 4	"os"
 5	"os/exec"
 6	"path/filepath"
 7	"strings"
 8	"testing"
 9)
10
11func TestFsckConnectivityFindsAMissingObject(t *testing.T) {
12	dir := t.TempDir()
13	git(t, dir, "init", "-q", "-b", "main")
14	write(t, dir, "a.txt", "a\n")
15	git(t, dir, "add", "a.txt")
16	git(t, dir, "commit", "-q", "-m", "one")
17	gitDir := filepath.Join(dir, ".git")
18	if err := FsckConnectivity(gitDir); err != nil {
19		t.Fatalf("intact repository: %v", err)
20	}
21	out, err := exec.Command("git", "-C", dir, "rev-parse", "HEAD:a.txt").Output()
22	if err != nil {
23		t.Fatal(err)
24	}
25	blob := strings.TrimSpace(string(out))
26	if err := os.Remove(filepath.Join(dir, ".git", "objects", blob[:2], blob[2:])); err != nil {
27		t.Fatal(err)
28	}
29	if err := FsckConnectivity(gitDir); err == nil {
30		t.Fatal("a repository missing a blob passed")
31	}
32}
33
34// A directory that is not a repository fails, even inside one: git does
35// not search upward and check the enclosing repository instead.
36func TestFsckConnectivityRefusesANonRepository(t *testing.T) {
37	dir := t.TempDir()
38	git(t, dir, "init", "-q", "-b", "main")
39	write(t, dir, "a.txt", "a\n")
40	git(t, dir, "add", "a.txt")
41	git(t, dir, "commit", "-q", "-m", "one")
42	inner := filepath.Join(dir, "repos", "x.git")
43	if err := os.MkdirAll(inner, 0o755); err != nil {
44		t.Fatal(err)
45	}
46	if err := FsckConnectivity(inner); err == nil {
47		t.Fatal("an empty directory inside a repository passed")
48	}
49}