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}