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) 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}