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}