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