GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package repository
6
7import (
8 "context"
9 "net/url"
10
11 "github.com/go-git/go-git/v6/storage"
12 "github.com/samber/oops"
13 "gitroot.dev/server/logger"
14)
15
16type gitRootFsLoader struct {
17 unlock func()
18 repo *GitRootRepository
19 repoWriter *GitRootRepositoryWrite
20}
21
22func (m *Manager) NewGitRootFsLoader(ctx context.Context, repoName string) (*gitRootFsLoader, *GitRootRepository, *GitRootRepositoryWrite, error) {
23 repo, err := m.Open(logger.AddCaller(ctx, "NewGitRootFsLoader"), repoName)
24 if err != nil {
25 return nil, nil, nil, oops.Wrapf(err, "can't open")
26 }
27 conf, err := repo.Configuration()
28 if err != nil {
29 return nil, nil, nil, oops.Wrapf(err, "can't get conf")
30 }
31 repoWriter, err := repo.WillWrite(conf.DefaultBranch)
32 if err != nil {
33 repo.Close()
34 return nil, nil, nil, oops.Wrapf(err, "can't WillWrite")
35 }
36 return &gitRootFsLoader{
37 repo: repo,
38 repoWriter: repoWriter,
39 }, repo, repoWriter, nil
40}
41
42func (m *Manager) NewGitRootReadFsLoader(ctx context.Context, repoName string) (*gitRootFsLoader, error) {
43 repo, err := m.Open(logger.AddCaller(ctx, "NewGitRootReadFsLoader"), repoName)
44 if err != nil {
45 return nil, oops.Wrapf(err, "can't open")
46 }
47 unlock := m.repoLocks.Read(repo.name)
48 return &gitRootFsLoader{
49 unlock: unlock,
50 repo: repo,
51 }, nil
52}
53
54func (fs *gitRootFsLoader) Load(ep *url.URL) (storage.Storer, error) {
55 if fs.repoWriter != nil {
56 return fs.repoWriter.Storer(), nil
57 }
58 return fs.repo.storer, nil
59}
60
61func (fs *gitRootFsLoader) Close() error {
62 if fs.unlock != nil {
63 fs.unlock()
64 }
65 return fs.repo.Close()
66}