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}