1package noop
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7
8 "github.com/charmbracelet/soft-serve/git"
9 "github.com/charmbracelet/soft-serve/server/backend"
10 "golang.org/x/crypto/ssh"
11)
12
13var ErrNotImpl = fmt.Errorf("not implemented")
14
15var _ backend.Backend = (*Noop)(nil)
16
17// Noop is a backend that does nothing. It's used for testing.
18type Noop struct {
19 Port string
20}
21
22// Admins implements backend.Backend
23func (*Noop) Admins() ([]string, error) {
24 return nil, nil
25}
26
27// Collaborators implements backend.Backend
28func (*Noop) Collaborators(repo string) ([]string, error) {
29 return nil, nil
30}
31
32// RemoveAdmin implements backend.Backend
33func (*Noop) RemoveAdmin(pk ssh.PublicKey) error {
34 return nil
35}
36
37// RemoveCollaborator implements backend.Backend
38func (*Noop) RemoveCollaborator(pk ssh.PublicKey, repo string) error {
39 return nil
40}
41
42// AccessLevel implements backend.AccessMethod
43func (*Noop) AccessLevel(repo string, pk ssh.PublicKey) backend.AccessLevel {
44 return backend.AdminAccess
45}
46
47// AddAdmin implements backend.Backend
48func (*Noop) AddAdmin(pk ssh.PublicKey, memo string) error {
49 return ErrNotImpl
50}
51
52// AddCollaborator implements backend.Backend
53func (*Noop) AddCollaborator(pk ssh.PublicKey, memo string, repo string) error {
54 return ErrNotImpl
55}
56
57// AllowKeyless implements backend.Backend
58func (*Noop) AllowKeyless() bool {
59 return true
60}
61
62// AnonAccess implements backend.Backend
63func (*Noop) AnonAccess() backend.AccessLevel {
64 return backend.AdminAccess
65}
66
67// CreateRepository implements backend.Backend
68func (*Noop) CreateRepository(name string, private bool) (backend.Repository, error) {
69 temp, err := os.MkdirTemp("", "soft-serve")
70 if err != nil {
71 return nil, err
72 }
73
74 rp := filepath.Join(temp, name)
75 _, err = git.Init(rp, private)
76 if err != nil {
77 return nil, err
78 }
79
80 return &repo{path: rp}, nil
81}
82
83// DeleteRepository implements backend.Backend
84func (*Noop) DeleteRepository(name string) error {
85 return ErrNotImpl
86}
87
88// Description implements backend.Backend
89func (*Noop) Description(repo string) string {
90 return ""
91}
92
93// IsAdmin implements backend.Backend
94func (*Noop) IsAdmin(pk ssh.PublicKey) bool {
95 return true
96}
97
98// IsCollaborator implements backend.Backend
99func (*Noop) IsCollaborator(pk ssh.PublicKey, repo string) bool {
100 return true
101}
102
103// IsPrivate implements backend.Backend
104func (*Noop) IsPrivate(repo string) bool {
105 return false
106}
107
108// RenameRepository implements backend.Backend
109func (*Noop) RenameRepository(oldName string, newName string) error {
110 return ErrNotImpl
111}
112
113// Repositories implements backend.Backend
114func (*Noop) Repositories() ([]backend.Repository, error) {
115 return nil, ErrNotImpl
116}
117
118// Repository implements backend.Backend
119func (*Noop) Repository(repo string) (backend.Repository, error) {
120 return nil, ErrNotImpl
121}
122
123// SetAllowKeyless implements backend.Backend
124func (*Noop) SetAllowKeyless(allow bool) error {
125 return ErrNotImpl
126}
127
128// SetAnonAccess implements backend.Backend
129func (*Noop) SetAnonAccess(level backend.AccessLevel) error {
130 return ErrNotImpl
131}
132
133// SetDescription implements backend.Backend
134func (*Noop) SetDescription(repo string, desc string) error {
135 return ErrNotImpl
136}
137
138// SetPrivate implements backend.Backend
139func (*Noop) SetPrivate(repo string, priv bool) error {
140 return ErrNotImpl
141}