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}