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