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