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