1package config
2
3import (
4 "errors"
5 "path/filepath"
6 "time"
7
8 "github.com/go-git/go-billy/v5/memfs"
9 gogit "github.com/go-git/go-git/v5"
10 "github.com/go-git/go-git/v5/plumbing/object"
11 "github.com/go-git/go-git/v5/plumbing/transport"
12 "github.com/go-git/go-git/v5/storage/memory"
13)
14
15const (
16 defaultConfigRepo = "config"
17 defaultReadme = "# Soft Serve\n\n Welcome! You can configure your Soft Serve server by cloning this repo and pushing changes.\n\n```\ngit clone ssh://localhost:23231/config\n```"
18)
19
20func (cfg *Config) createDefaultConfigRepoAndUsers() error {
21 rp := filepath.Join(cfg.RepoPath(), defaultConfigRepo) + ".git"
22 _, err := gogit.PlainOpen(rp)
23 if errors.Is(err, gogit.ErrRepositoryNotExists) {
24 if err := cfg.Create(defaultConfigRepo, "Config", "Soft Serve Config", true); err != nil {
25 return err
26 }
27 repo, err := gogit.Clone(memory.NewStorage(), memfs.New(), &gogit.CloneOptions{
28 URL: rp,
29 })
30 if err != nil && err != transport.ErrEmptyRemoteRepository {
31 return err
32 }
33 wt, err := repo.Worktree()
34 if err != nil {
35 return err
36 }
37 rm, err := wt.Filesystem.Create("README.md")
38 if err != nil {
39 return err
40 }
41 _, err = rm.Write([]byte(defaultReadme))
42 if err != nil {
43 return err
44 }
45 _, err = wt.Add("README.md")
46 if err != nil {
47 return err
48 }
49 author := object.Signature{
50 Name: "Soft Serve Server",
51 Email: "vt100@charm.sh",
52 When: time.Now(),
53 }
54 _, err = wt.Commit("Default init", &gogit.CommitOptions{
55 All: true,
56 Author: &author,
57 Committer: &author,
58 })
59 if err != nil {
60 return err
61 }
62 err = repo.Push(&gogit.PushOptions{})
63 if err != nil {
64 return err
65 }
66 }
67 return nil
68}