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 "os"
9
10 "github.com/go-git/go-git/v5/plumbing/protocol/packp"
11 "gitroot.dev/server/logger"
12 "gitroot.dev/server/user"
13)
14
15type Manager struct {
16 logger *logger.Logger
17 conf needConf
18 userManager needUser
19 backgroundManager needBackground
20 repoLocks *repoLocks
21 cacheRepos *cacheRepos
22}
23
24type needConf interface {
25 GetDirPathForRepo(repoName string) string
26 PathDataWeb(repoName string) string
27 ForPathConfig(filename string) string
28 PathFileUsers() string
29 ForgeConfigName() string
30 DefaultBranchName() string
31 Marshall() ([]byte, error)
32 PathFileForgeConfig() string
33 PathFileRepositories() string
34 PathFilePlugins() string
35 PathFileRepoConfigurationName() string
36 PathRepositories() string
37}
38
39type needUser interface {
40 RootCommiter() *user.Commiter
41}
42
43type needBackground interface {
44 PostPush(pusher user.SimpleUser, repoName string, commands []*packp.Command)
45}
46
47func NewManager(conf needConf, userManager needUser) *Manager {
48 return &Manager{
49 logger: logger.NewLogger(logger.REPOSITORY_MANAGER),
50 conf: conf,
51 userManager: userManager,
52 repoLocks: newRepoLocks(),
53 cacheRepos: &cacheRepos{repos: make(map[string]*cacheRepo)},
54 }
55}
56
57func (m *Manager) SetBackgroundManager(backgroundManager needBackground) {
58 m.backgroundManager = backgroundManager
59}
60
61func (m *Manager) Delete(repoName string) error {
62 l := m.repoLocks.WillWrite(repoName)
63 defer l.Close()
64 unlock := l.Write()
65 defer unlock()
66 m.cacheRepos.Remove(repoName)
67 return m.cacheRepos.Delete(repoName, func() error {
68 path := m.conf.GetDirPathForRepo(repoName)
69 return os.RemoveAll(path)
70 })
71
72}