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}