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 }