1package repository
2
3import (
4 "log"
5 "path/filepath"
6 "strings"
7 "testing"
8
9 "github.com/99designs/keyring"
10)
11
12type TestingT interface {
13 Cleanup(func())
14 Helper()
15 TempDir() string
16}
17
18const namespace = "git-bug"
19
20// This is intended for testing only
21
22func CreateGoGitTestRepo(t TestingT, bare bool) TestedRepo {
23 t.Helper()
24
25 dir := t.TempDir()
26
27 var creator func(string, string) (*GoGitRepo, error)
28
29 if bare {
30 creator = InitBareGoGitRepo
31 } else {
32 creator = InitGoGitRepo
33 }
34
35 repo, err := creator(dir, namespace)
36 if err != nil {
37 log.Fatal(err)
38 }
39
40 t.Cleanup(func() {
41 repo.Close()
42 })
43
44 config := repo.LocalConfig()
45 if err := config.StoreString("user.name", "testuser"); err != nil {
46 log.Fatal("failed to set user.name for test repository: ", err)
47 }
48 if err := config.StoreString("user.email", "testuser@example.com"); err != nil {
49 log.Fatal("failed to set user.email for test repository: ", err)
50 }
51
52 // make sure we use a mock keyring for testing to not interact with the global system
53 return &replaceKeyring{
54 TestedRepo: repo,
55 keyring: keyring.NewArrayKeyring(nil),
56 }
57}
58
59func SetupGoGitReposAndRemote(t *testing.T) (repoA, repoB, remote TestedRepo) {
60 t.Helper()
61
62 repoA = CreateGoGitTestRepo(t, false)
63 repoB = CreateGoGitTestRepo(t, false)
64 remote = CreateGoGitTestRepo(t, true)
65
66 err := repoA.AddRemote("origin", remote.GetLocalRemote())
67 if err != nil {
68 log.Fatal(err)
69 }
70
71 err = repoB.AddRemote("origin", remote.GetLocalRemote())
72 if err != nil {
73 log.Fatal(err)
74 }
75
76 return repoA, repoB, remote
77}
78
79func RepoDir(t *testing.T, repo TestedRepo) string {
80 t.Helper()
81
82 dir := repo.GetLocalRemote()
83 if strings.HasSuffix(dir, ".git") {
84 dir, _ = filepath.Split(dir)
85 }
86
87 if dir[len(dir)-1] == filepath.Separator {
88 dir = dir[:len(dir)-1]
89 }
90
91 return dir
92}