ef421f5f1335b367bce01f2d0bbc65cf889a974c

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

Treat config as a bare git repository to keep consistency

Diff

  1diff --git a/go.mod b/go.mod
  2index e41ca0fca7cd8b6477f9be0e923fbb9bbe824f3e..8e02292ab0ca1599805a47ae43f1f1fcd1724021 100644
  3--- a/go.mod
  4+++ b/go.mod
  5@@ -20,6 +20,8 @@ require (
  6 	gopkg.in/yaml.v2 v2.3.0
  7 )
  8 
  9+require github.com/go-git/go-billy/v5 v5.3.1
 10+
 11 require (
 12 	github.com/Microsoft/go-winio v0.4.16 // indirect
 13 	github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
 14@@ -33,7 +35,6 @@ require (
 15 	github.com/dlclark/regexp2 v1.2.0 // indirect
 16 	github.com/emirpasic/gods v1.12.0 // indirect
 17 	github.com/go-git/gcfg v1.5.0 // indirect
 18-	github.com/go-git/go-billy/v5 v5.3.1 // indirect
 19 	github.com/gorilla/css v1.0.0 // indirect
 20 	github.com/imdario/mergo v0.3.12 // indirect
 21 	github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
 22diff --git a/internal/config/config.go b/internal/config/config.go
 23index 88b6af052fbbc42594c12cd1b64cdf6941c39066..5cf9397441bb1d5d6c15d4dfd097310738ff450e 100644
 24--- a/internal/config/config.go
 25+++ b/internal/config/config.go
 26@@ -7,7 +7,6 @@ import (
 27 
 28 	"fmt"
 29 	"os"
 30-	"path/filepath"
 31 
 32 	"github.com/charmbracelet/soft/config"
 33 	"github.com/charmbracelet/soft/internal/git"
 34@@ -125,22 +124,27 @@ func (cfg *Config) createDefaultConfigRepo(yaml string) error {
 35 	}
 36 	_, err = rs.GetRepo(cn)
 37 	if err == git.ErrMissingRepo {
 38-		cr, err := rs.InitRepo(cn, false)
 39+		cr, err := rs.InitRepo(cn, true)
 40 		if err != nil {
 41 			return err
 42 		}
 43-
 44-		rp := filepath.Join(rs.Path, cn, "README.md")
 45-		err = createFile(rp, defaultReadme)
 46+		wt, err := cr.Repository.Worktree()
 47 		if err != nil {
 48 			return err
 49 		}
 50-		cp := filepath.Join(rs.Path, cn, "config.yaml")
 51-		err = createFile(cp, yaml)
 52+		rm, err := wt.Filesystem.Create("README.md")
 53 		if err != nil {
 54 			return err
 55 		}
 56-		wt, err := cr.Repository.Worktree()
 57+		_, err = rm.Write([]byte(defaultReadme))
 58+		if err != nil {
 59+			return err
 60+		}
 61+		cf, err := wt.Filesystem.Create("config.yaml")
 62+		if err != nil {
 63+			return err
 64+		}
 65+		_, err = cf.Write([]byte(yaml))
 66 		if err != nil {
 67 			return err
 68 		}
 69@@ -162,6 +166,7 @@ func (cfg *Config) createDefaultConfigRepo(yaml string) error {
 70 		if err != nil {
 71 			return err
 72 		}
 73+		err = cr.Repository.Push(&gg.PushOptions{})
 74 		if err != nil {
 75 			return err
 76 		}
 77diff --git a/internal/git/git.go b/internal/git/git.go
 78index 074cbf83b8c94abcf7ed14886f96d62ffe463616..66a7c7bcca49ac7130eb2a7279c2f93f3b891251 100644
 79--- a/internal/git/git.go
 80+++ b/internal/git/git.go
 81@@ -4,12 +4,16 @@ import (
 82 	"errors"
 83 	"log"
 84 	"os"
 85+	"path/filepath"
 86 	"sort"
 87 	"sync"
 88 	"time"
 89 
 90+	"github.com/go-git/go-billy/v5/memfs"
 91 	"github.com/go-git/go-git/v5"
 92 	"github.com/go-git/go-git/v5/plumbing/object"
 93+	"github.com/go-git/go-git/v5/plumbing/transport"
 94+	"github.com/go-git/go-git/v5/storage/memory"
 95 )
 96 
 97 var ErrMissingRepo = errors.New("missing repo")
 98@@ -70,10 +74,21 @@ func (rs *RepoSource) GetRepo(name string) (*Repo, error) {
 99 func (rs *RepoSource) InitRepo(name string, bare bool) (*Repo, error) {
100 	rs.mtx.Lock()
101 	defer rs.mtx.Unlock()
102-	rg, err := git.PlainInit(rs.Path+string(os.PathSeparator)+name, bare)
103+	rp := filepath.Join(rs.Path, name)
104+	rg, err := git.PlainInit(rp, bare)
105 	if err != nil {
106 		return nil, err
107 	}
108+	if bare {
109+		// Clone repo into memory storage
110+		ar, err := git.Clone(memory.NewStorage(), memfs.New(), &git.CloneOptions{
111+			URL: rp,
112+		})
113+		if err != nil && err != transport.ErrEmptyRemoteRepository {
114+			return nil, err
115+		}
116+		rg = ar
117+	}
118 	r := &Repo{
119 		Name:       name,
120 		Repository: rg,
121@@ -102,7 +117,7 @@ func (rs *RepoSource) LoadRepos() error {
122 	rs.commits = make([]RepoCommit, 0)
123 	for _, de := range rd {
124 		rn := de.Name()
125-		rg, err := git.PlainOpen(rs.Path + string(os.PathSeparator) + rn)
126+		rg, err := git.PlainOpen(filepath.Join(rs.Path, rn))
127 		if err != nil {
128 			return err
129 		}