default.go

 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}