internal/gitutil/fsck_test.go
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}