f38848d4a132194cfe1aa7e900fd4c80304870b4
- Author
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Committer
- Ayman Bagabas <ayman.bagabas@gmail.com>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/server/backend/file/file.go b/server/backend/file/file.go
2index 68e5d92ff701dcadc50ba3939b66e26f560cda51..f0a72f3b38a43d4165d5bee40eb5da08c21f9b18 100644
3--- a/server/backend/file/file.go
4+++ b/server/backend/file/file.go
5@@ -26,6 +26,7 @@ import (
6 "io/fs"
7 "os"
8 "path/filepath"
9+ "strconv"
10 "strings"
11
12 "github.com/charmbracelet/log"
13@@ -38,15 +39,16 @@ import (
14
15 // sub file and directory names.
16 const (
17- anonAccess = "anon-access"
18- allowKeyless = "allow-keyless"
19- admins = "admins"
20- repos = "repos"
21- collabs = "collaborators"
22- description = "description"
23- exportOk = "git-daemon-export-ok"
24- private = "private"
25- settings = "settings"
26+ anonAccess = "anon-access"
27+ defaultBranch = "default-branch"
28+ allowKeyless = "allow-keyless"
29+ admins = "admins"
30+ repos = "repos"
31+ collabs = "collaborators"
32+ description = "description"
33+ exportOk = "git-daemon-export-ok"
34+ private = "private"
35+ settings = "settings"
36 )
37
38 var (
39@@ -86,7 +88,8 @@ func (fb *FileBackend) adminsPath() string {
40 }
41
42 func (fb *FileBackend) collabsPath(repo string) string {
43- return filepath.Join(fb.path, collabs, repo, collabs)
44+ repo = utils.SanitizeRepo(repo) + ".git"
45+ return filepath.Join(fb.reposPath(), repo, collabs)
46 }
47
48 func readOneLine(path string) (string, error) {
49@@ -125,7 +128,7 @@ func NewFileBackend(path string) (*FileBackend, error) {
50 }
51 }
52
53- for _, file := range []string{admins, anonAccess, allowKeyless} {
54+ for _, file := range []string{admins, anonAccess, allowKeyless, defaultBranch} {
55 fp := filepath.Join(fb.settingsPath(), file)
56 _, err := os.Stat(fp)
57 if errors.Is(err, fs.ErrNotExist) {
58@@ -444,6 +447,26 @@ func (fb *FileBackend) AnonAccess() backend.AccessLevel {
59 }
60 }
61
62+// DefaultBranch returns the default branch for new repositories.
63+//
64+// It implements backend.Backend.
65+func (fb *FileBackend) DefaultBranch() string {
66+ line, err := readOneLine(filepath.Join(fb.settingsPath(), defaultBranch))
67+ if err != nil {
68+ logger.Debug("failed to read default-branch file", "err", err)
69+ return defaults[defaultBranch]
70+ }
71+
72+ return line
73+}
74+
75+// SetDefaultBranch sets the default branch for new repositories.
76+//
77+// It implements backend.Backend.
78+func (fb *FileBackend) SetDefaultBranch(branch string) error {
79+ return os.WriteFile(filepath.Join(fb.settingsPath(), defaultBranch), []byte(branch), 0600)
80+}
81+
82 // Description returns the description of the given repo.
83 //
84 // It implements backend.Backend.
85@@ -531,28 +554,14 @@ func (fb *FileBackend) IsPrivate(repo string) bool {
86 //
87 // It implements backend.Backend.
88 func (fb *FileBackend) SetAllowKeyless(allow bool) error {
89- f, err := os.OpenFile(filepath.Join(fb.settingsPath(), allowKeyless), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
90- if err != nil {
91- return fmt.Errorf("failed to open allow-keyless file: %w", err)
92- }
93-
94- defer f.Close() //nolint:errcheck
95- _, err = fmt.Fprintln(f, allow)
96- return err
97+ return os.WriteFile(filepath.Join(fb.settingsPath(), allowKeyless), []byte(strconv.FormatBool(allow)), 0600)
98 }
99
100 // SetAnonAccess sets the anonymous access level.
101 //
102 // It implements backend.Backend.
103 func (fb *FileBackend) SetAnonAccess(level backend.AccessLevel) error {
104- f, err := os.OpenFile(filepath.Join(fb.settingsPath(), anonAccess), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
105diff --git a/server/backend/noop/noop.go b/server/backend/noop/noop.go
106deleted file mode 100644
107index db7324bc0b60fe7fa006b70d1d530e94358446af..0000000000000000000000000000000000000000
108--- a/server/backend/noop/noop.go
109+++ /dev/null
110@@ -1,141 +0,0 @@
111-package noop
112-
113-import (
114- "fmt"
115- "os"
116- "path/filepath"
117-
118- "github.com/charmbracelet/soft-serve/git"
119- "github.com/charmbracelet/soft-serve/server/backend"
120- "golang.org/x/crypto/ssh"
121-)
122-
123-var ErrNotImpl = fmt.Errorf("not implemented")
124-
125-var _ backend.Backend = (*Noop)(nil)
126-
127-// Noop is a backend that does nothing. It's used for testing.
128-type Noop struct {
129- Port string
130-}
131-
132-// Admins implements backend.Backend
133-func (*Noop) Admins() ([]string, error) {
134- return nil, nil
135-}
136-
137-// Collaborators implements backend.Backend
138-func (*Noop) Collaborators(repo string) ([]string, error) {
139- return nil, nil
140-}
141-
142-// RemoveAdmin implements backend.Backend
143-func (*Noop) RemoveAdmin(pk ssh.PublicKey) error {
144- return nil
145-}
146-
147-// RemoveCollaborator implements backend.Backend
148-func (*Noop) RemoveCollaborator(pk ssh.PublicKey, repo string) error {
149- return nil
150-}
151-
152-// AccessLevel implements backend.AccessMethod
153-func (*Noop) AccessLevel(repo string, pk ssh.PublicKey) backend.AccessLevel {
154- return backend.AdminAccess
155-}
156-
157-// AddAdmin implements backend.Backend
158-func (*Noop) AddAdmin(pk ssh.PublicKey, memo string) error {
159- return ErrNotImpl
160-}
161-
162-// AddCollaborator implements backend.Backend
163-func (*Noop) AddCollaborator(pk ssh.PublicKey, memo string, repo string) error {
164- return ErrNotImpl
165-}
166-
167-// AllowKeyless implements backend.Backend
168-func (*Noop) AllowKeyless() bool {
169- return true
170-}
171-
172-// AnonAccess implements backend.Backend
173-func (*Noop) AnonAccess() backend.AccessLevel {
174- return backend.AdminAccess
175-}
176-
177-// CreateRepository implements backend.Backend
178-func (*Noop) CreateRepository(name string, private bool) (backend.Repository, error) {
179- temp, err := os.MkdirTemp("", "soft-serve")
180- if err != nil {
181- return nil, err
182- }
183-
184- rp := filepath.Join(temp, name)
185- _, err = git.Init(rp, private)
186- if err != nil {
187- return nil, err
188- }
189-
190- return &repo{path: rp}, nil
191-}
192-
193-// DeleteRepository implements backend.Backend
194-func (*Noop) DeleteRepository(name string) error {
195- return ErrNotImpl
196-}
197-
198-// Description implements backend.Backend
199-func (*Noop) Description(repo string) string {
200- return ""
201-}
202-
203-// IsAdmin implements backend.Backend
204-func (*Noop) IsAdmin(pk ssh.PublicKey) bool {
205- return true
206-}
207-
208-// IsCollaborator implements backend.Backend
209-func (*Noop) IsCollaborator(pk ssh.PublicKey, repo string) bool {
210diff --git a/server/backend/noop/repo.go b/server/backend/noop/repo.go
211deleted file mode 100644
212index 12d5394c0bd93c4ee328389600d10f922b4e501e..0000000000000000000000000000000000000000
213--- a/server/backend/noop/repo.go
214+++ /dev/null
215@@ -1,32 +0,0 @@
216-package noop
217-
218-import (
219- "github.com/charmbracelet/soft-serve/git"
220- "github.com/charmbracelet/soft-serve/server/backend"
221-)
222-
223-var _ backend.Repository = (*repo)(nil)
224-
225-type repo struct {
226- path string
227-}
228-
229-// Description implements backend.Repository
230-func (*repo) Description() string {
231- return ""
232-}
233-
234-// IsPrivate implements backend.Repository
235-func (*repo) IsPrivate() bool {
236- return false
237-}
238-
239-// Name implements backend.Repository
240-func (*repo) Name() string {
241- return ""
242-}
243-
244-// Repository implements backend.Repository
245-func (r *repo) Open() (*git.Repository, error) {
246- return git.Open(r.path)
247-}
248diff --git a/server/backend/server.go b/server/backend/server.go
249index 72198c018d445afabc5b2a5e049e742894c1fb5c..2f0c54a497a3aefce6167f11ba75c37a961931df 100644
250--- a/server/backend/server.go
251+++ b/server/backend/server.go
252@@ -10,4 +10,8 @@ type ServerBackend interface {
253 AllowKeyless() bool
254 // SetAllowKeyless sets whether or not keyless access is allowed.
255 SetAllowKeyless(allow bool) error
256+ // DefaultBranch returns the default branch for new repositories.
257+ DefaultBranch() string
258+ // SetDefaultBranch sets the default branch for new repositories.
259+ SetDefaultBranch(branch string) error
260 }