// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package repository import ( "context" "net/url" "github.com/go-git/go-git/v6/plumbing" "github.com/go-git/go-git/v6/storage" "github.com/samber/oops" "gitroot.dev/server/logger" ) type gitRootFsLoader struct { unlock func() repo *GitRootRepository repoWriter *GitRootRepositoryWrite } func (m *Manager) NewGitRootFsLoader(ctx context.Context, repoName string) (*gitRootFsLoader, *GitRootRepository, *GitRootRepositoryWrite, error) { repo, err := m.Open(logger.AddCaller(ctx, "NewGitRootFsLoader"), repoName) if err != nil { return nil, nil, nil, oops.Wrapf(err, "can't open") } repoWriter, err := repo.WillWrite(plumbing.HEAD) if err != nil { repo.Close() return nil, nil, nil, oops.Wrapf(err, "can't WillWrite") } return &gitRootFsLoader{ repo: repo, repoWriter: repoWriter, }, repo, repoWriter, nil } func (m *Manager) NewGitRootReadFsLoader(ctx context.Context, repoName string) (*gitRootFsLoader, error) { repo, err := m.Open(logger.AddCaller(ctx, "NewGitRootReadFsLoader"), repoName) if err != nil { return nil, oops.Wrapf(err, "can't open") } unlock := m.repoLocks.Read(repo.name) return &gitRootFsLoader{ unlock: unlock, repo: repo, }, nil } func (fs *gitRootFsLoader) Load(ep *url.URL) (storage.Storer, error) { if fs.repoWriter != nil { return fs.repoWriter.Storer(), nil } return fs.repo.storer, nil } func (fs *gitRootFsLoader) Close() error { if fs.unlock != nil { fs.unlock() } return fs.repo.Close() }