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}