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}