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/v6/plumbing/format/config"
11	"github.com/samber/oops"
12	"gitroot.dev/server/logger"
13)
14
15func (m *Manager) OpenForgeRepo(ctx context.Context) (*GitRootRepository, error) {
16	return m.Open(logger.AddCaller(ctx, "OpenForgeRepo"), m.conf.ForgeConfigName())
17}
18
19func (m *Manager) Open(ctx context.Context, repoName string) (*GitRootRepository, error) {
20	m.logger.Info("Open repository", logger.NewLoggerPair("repo", repoName)).LogCaller(ctx, "Open")
21	if r, ok := m.cacheRepos.Get(repoName); ok {
22		repo, err := m.NewGitRootRepository(repoName, r)
23		if err != nil {
24			return nil, err
25		}
26		m.cacheRepos.Add(repo)
27		return repo, nil
28	}
29
30	repo, err := m.NewGitRootRepository(repoName, nil)
31	if err != nil {
32		return nil, err
33	}
34	m.cacheRepos.Add(repo)
35
36	// repositories created before 0.5 haven't this conf in .git/config
37	gitConf, err := repo.storer.Config()
38	if err != nil {
39		return nil, oops.Wrapf(err, "open repo storer config")
40	}
41	if gitConf.Init.DefaultBranch == "" {
42		m.logger.Debug("Repo don't have .git/config::init::defaultBranch set one", logger.NewLoggerPair("repo", repoName), logger.NewLoggerPair("defaultBranch", m.conf.DefaultBranchName()))
43		gitConf.Init.DefaultBranch = m.conf.DefaultBranchName()
44		gitConf.Core.RepositoryFormatVersion = config.DefaultRepositoryFormatVersion
45		gitConf.Raw.RemoveSection("extensions")
46		err = repo.storer.SetConfig(gitConf)
47		if err != nil {
48			return nil, oops.Wrapf(err, "open repo storer setconfig")
49		}
50	}
51
52	m.logger.Debug("Open repository added in cache", logger.NewLoggerPair("repo", repoName))
53	return repo, nil
54}