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
10 "github.com/go-git/go-git/v5/plumbing"
11 "github.com/go-git/go-git/v5/plumbing/storer"
12 "github.com/go-git/go-git/v5/plumbing/transport"
13 "github.com/samber/oops"
14 "gitroot.dev/server/logger"
15)
16
17type gitRootFsLoader struct {
18 repo *GitRootRepository
19 repoWriter *GitRootRepositoryWrite
20}
21
22type needRepo interface {
23 Open(ctx context.Context, repoName string) (*GitRootRepository, error)
24}
25
26func NewGitRootFsLoader(ctx context.Context, repoName string, repoManager needRepo) (*gitRootFsLoader, *GitRootRepository, *GitRootRepositoryWrite, error) {
27 repo, err := repoManager.Open(logger.AddCaller(ctx, "NewGitRootFsLoader"), repoName)
28 if err != nil {
29 return nil, nil, nil, oops.Wrapf(err, "can't open")
30 }
31 repoWriter, err := repo.WillWrite(plumbing.HEAD)
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 (fs *gitRootFsLoader) Load(ep *transport.Endpoint) (storer.Storer, error) {
43 return fs.repoWriter.Storer(), nil
44}
45
46func (fs *gitRootFsLoader) Close() error {
47 return fs.repo.Close()
48}