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}