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}