all repos

mugit @ v0.3.0

🐮 git server that your cow will love

mugit/internal/git/hooks_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
setup per repo hooks, 22 days ago
1
package git
2
3
import (
4
	"bytes"
5
	"os"
6
	"path/filepath"
7
	"strings"
8
	"testing"
9
10
	"olexsmir.xyz/x/is"
11
)
12
13
func TestRepo_SetupHooks(t *testing.T) {
14
	t.Run("creates hook delegates and hook directories", func(t *testing.T) {
15
		repoPath := filepath.Join(t.TempDir(), "hooks.git")
16
		is.Err(t, Init(repoPath), nil)
17
18
		for _, hook := range serverHookNames {
19
			delegatePath := filepath.Join(repoPath, "hooks", hook)
20
			info, err := os.Stat(delegatePath)
21
			is.Err(t, err, nil)
22
			is.Equal(t, info.Mode()&0o111 != 0, true)
23
24
			hookDir := filepath.Join(repoPath, "hooks", hook+".d")
25
			dirInfo, err := os.Stat(hookDir)
26
			is.Err(t, err, nil)
27
			is.Equal(t, dirInfo.IsDir(), true)
28
		}
29
	})
30
31
	t.Run("is idempotent", func(t *testing.T) {
32
		repoPath := filepath.Join(t.TempDir(), "hooks.git")
33
		is.Err(t, Init(repoPath), nil)
34
35
		repo, err := Open(repoPath, "")
36
		is.Err(t, err, nil)
37
38
		is.Err(t, repo.SetupHooks(), nil)
39
		is.Err(t, repo.SetupHooks(), nil)
40
	})
41
42
	t.Run("keeps custom scripts in hook directories", func(t *testing.T) {
43
		repoPath := filepath.Join(t.TempDir(), "hooks.git")
44
		is.Err(t, Init(repoPath), nil)
45
46
		customHook := filepath.Join(repoPath, "hooks", "pre-receive.d", "90-custom.sh")
47
		is.Err(t, os.WriteFile(customHook, []byte("#!/bin/sh\necho ok\n"), 0o755), nil)
48
49
		repo, err := Open(repoPath, "")
50
		is.Err(t, err, nil)
51
		is.Err(t, repo.SetupHooks(), nil)
52
53
		data, err := os.ReadFile(customHook)
54
		is.Err(t, err, nil)
55
		is.Equal(t, string(data), "#!/bin/sh\necho ok\n")
56
	})
57
58
	t.Run("delegate forwards stdin and args to hook scripts", func(t *testing.T) {
59
		repoPath := filepath.Join(t.TempDir(), "hooks.git")
60
		is.Err(t, Init(repoPath), nil)
61
62
		delegatePath := filepath.Join(repoPath, "hooks", "update")
63
		delegate, err := os.ReadFile(delegatePath)
64
		is.Err(t, err, nil)
65
		firstLine, _, _ := strings.Cut(string(delegate), "\n")
66
		is.Equal(t, strings.HasPrefix(firstLine, "#!"), true)
67
		is.Equal(t, strings.Contains(firstLine, "bash"), true)
68
		is.Equal(t, strings.Contains(firstLine, "/usr/bin/env"), false)
69
		is.Equal(t, bytes.Contains(delegate, []byte(`echo "${data}" | "${hook}" "$@"`)), true)
70
	})
71
}