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) createDefaultConfigRepo() error {
21 rp := filepath.Join(cfg.RepoPath(), defaultConfigRepo) + ".git"
22 _, err := gogit.PlainOpen(rp)
23 if errors.Is(err, gogit.ErrRepositoryNotExists) {
24 repo, err := gogit.PlainInit(rp, true)
25 if err != nil {
26 return err
27 }
28 repo, err = gogit.Clone(memory.NewStorage(), memfs.New(), &gogit.CloneOptions{
29 URL: rp,
30 })
31 if err != nil && err != transport.ErrEmptyRemoteRepository {
32 return err
33 }
34 wt, err := repo.Worktree()
35 if err != nil {
36 return err
37 }
38 rm, err := wt.Filesystem.Create("README.md")
39 if err != nil {
40 return err
41 }
42 _, err = rm.Write([]byte(defaultReadme))
43 if err != nil {
44 return err
45 }
46 _, err = wt.Add("README.md")
47 if err != nil {
48 return err
49 }
50 author := object.Signature{
51 Name: "Soft Serve Server",
52 Email: "vt100@charm.sh",
53 When: time.Now(),
54 }
55 _, err = wt.Commit("Default init", &gogit.CommitOptions{
56 All: true,
57 Author: &author,
58 Committer: &author,
59 })
60 if err != nil {
61 return err
62 }
63 err = repo.Push(&gogit.PushOptions{})
64 if err != nil {
65 return err
66 }
67 }
68 return nil
69}