f38848d4a132194cfe1aa7e900fd4c80304870b4

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

feat(backend): repo defaultBranch setting & collabs path

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 }