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 configuration
6
7import (
8 "bytes"
9 "fmt"
10 "io/fs"
11 "os"
12 "path/filepath"
13 "strings"
14
15 "github.com/goccy/go-yaml"
16)
17
18type Configuration struct {
19 SshAddr string
20 HttpAddr string
21 DomainName string
22
23 RootCommiterName string
24 RootRepositoryName string
25 DefaultBranch string
26
27 NbWorkerInBackground int
28
29 pathRepositories string
30 pathData string
31 pathDataPlugin string
32 pathDataWeb string
33 pathCache string
34 repositoriesFilename string
35 fileUsersName string
36 pathConfig string
37 forgeConfigName string
38 filePluginsName string
39 fileRepoConfigurationName string
40}
41
42func NewConfiguration(rootPath string) *Configuration {
43 return &Configuration{
44 SshAddr: fmt.Sprintf("%s:%d", "0.0.0.0", 4545),
45 HttpAddr: fmt.Sprintf("%s:%d", "0.0.0.0", 4546),
46 DomainName: "localhost",
47
48 RootCommiterName: "GitRoot",
49 RootRepositoryName: "root",
50 DefaultBranch: "main",
51
52 NbWorkerInBackground: 3,
53
54 pathRepositories: fmt.Sprintf("%s/repositories", rootPath),
55 pathData: fmt.Sprintf("%s/data", rootPath),
56 pathDataPlugin: fmt.Sprintf("%s/data/plugins", rootPath),
57 pathDataWeb: fmt.Sprintf("%s/data/web", rootPath),
58 pathCache: fmt.Sprintf("%s/data/cache", rootPath),
59
60 repositoriesFilename: "repositories.yml",
61 fileUsersName: "users.yml",
62 pathConfig: ".gitroot",
63 forgeConfigName: "forgeConfig.yml",
64 filePluginsName: "plugins.yml",
65 fileRepoConfigurationName: "repoConfiguration.yml",
66 }
67}
68
69func (c *Configuration) LoadFromFile(filecontent []byte) error {
70 return yaml.Unmarshal(filecontent, c)
71}
72
73func (c *Configuration) Marshall() ([]byte, error) {
74 warning := "# /!\\ A restart of GitRoot is need before change in this file take effect. /!\\ #\n"
75 sep := fmt.Sprintf("%s\n", strings.Repeat("#", len(warning)-1))
76 buf := bytes.NewBufferString(sep)
77 buf.WriteString(warning)
78 buf.WriteString(sep)
79 buf.WriteString("\n")
80 conf, err := yaml.MarshalWithOptions(c, yaml.WithComment(
81 yaml.CommentMap{
82 "$.sshaddr": []*yaml.Comment{yaml.LineComment("The ssh address to listen to with ip:port form")},
83 "$.httpaddr": []*yaml.Comment{yaml.LineComment("The http address to listen to with ip:port form")},
84 },
85 ))
86 if err != nil {
87 return nil, err
88 }
89 buf.Write(conf)
90 return buf.Bytes(), nil
91}
92
93func (c *Configuration) GetEmail(pseudo string) string {
94 return fmt.Sprintf("%s@%s", pseudo, c.DomainName)
95}
96
97func (c *Configuration) RootCommiterPseudo() string {
98 return c.RootCommiterName
99}
100
101func (c *Configuration) IsRootCommiter(pseudo string) bool {
102 return c.RootCommiterName == pseudo
103}
104
105func (c *Configuration) ForgeConfigName() string {
106 return c.RootRepositoryName
107}
108
109func (c *Configuration) DefaultBranchName() string {
110 return c.DefaultBranch
111}
112
113func (c *Configuration) IsForgeRepo(name string) bool {
114 return c.RootRepositoryName == name
115}
116
117func (c *Configuration) PathRepositories() string {
118 return c.pathRepositories
119}
120
121func (c *Configuration) PathFileForgeConfig() string {
122 return fmt.Sprintf("%s/%s", c.pathConfig, c.forgeConfigName)
123}
124
125func (c *Configuration) PathFileUsers() string {
126 return fmt.Sprintf("%s/%s", c.pathConfig, c.fileUsersName)
127}
128
129func (c *Configuration) PathFileRepositories() string {
130 return fmt.Sprintf("%s/%s", c.pathConfig, c.repositoriesFilename)
131}
132
133func (c *Configuration) PathFilePlugins() string {
134 return fmt.Sprintf("%s/%s", c.pathConfig, c.filePluginsName)
135}
136
137func (c *Configuration) PathFileRepoConfigurationName() string {
138 return fmt.Sprintf("%s/%s", c.pathConfig, c.fileRepoConfigurationName)
139}
140
141func (c *Configuration) GetDirPathForRepo(repoName string) string {
142 return fmt.Sprintf("%s/%s", c.pathRepositories, repoName)
143}
144
145func (c *Configuration) GetDirPathData() string {
146 return c.pathData
147}
148
149func (c *Configuration) PathDataPlugin() string {
150 return c.pathDataPlugin
151}
152
153func (c *Configuration) DataWeb(repoName string) fs.FS {
154 return os.DirFS(c.PathDataWeb(repoName))
155}
156
157func (c *Configuration) PathDataWeb(repoName string) string {
158 return fmt.Sprintf("%s/%s/", c.pathDataWeb, repoName)
159}
160
161func (c *Configuration) Cache(repoName string, pluginName string) fs.FS {
162 return os.DirFS(filepath.Join(c.pathCache, repoName, pluginName))
163}
164
165func (c *Configuration) PathCache() string {
166 return c.pathCache
167}
168
169func (c *Configuration) GetDirPathDataPlugin(pluginName string) string {
170 return fmt.Sprintf("%s/%s", c.pathDataPlugin, pluginName)
171}
172
173func (c *Configuration) ForPathConfig(name string) string {
174 return fmt.Sprintf("%s/%s", c.pathConfig, name)
175}
176
177func (c *Configuration) NbWorkerBackground() int {
178 return c.NbWorkerInBackground
179}