Skip to content

Commit 57234c4

Browse files
committed
refact repo to operate on Files not Read-Writers
1 parent ba110d1 commit 57234c4

File tree

3 files changed

+65
-72
lines changed

3 files changed

+65
-72
lines changed

app/repo/mock.go

+49-35
Original file line numberDiff line numberDiff line change
@@ -4,73 +4,87 @@ import (
44
"fmt"
55
"io"
66
"os"
7-
"strings"
7+
8+
"github.com/go-git/go-billy/v5"
9+
"github.com/go-git/go-billy/v5/memfs"
810
)
911

1012

1113
type Mock struct {
1214
Files map[string]string
13-
files map[string]string
15+
fs billy.Filesystem
1416
inited bool
1517
}
1618

1719
func (r *Mock) Init() error {
1820
if r.inited {
1921
return fmt.Errorf("already initialized")
2022
}
21-
r.files = r.Files
23+
r.fs = memfs.New()
24+
for fname, content := range r.Files {
25+
f, err := r.fs.Create(fname)
26+
if err != nil {
27+
return err
28+
}
29+
_, err = f.Write([]byte(content))
30+
if err != nil {
31+
return err
32+
}
33+
34+
err = f.Close()
35+
36+
if err != nil {
37+
return err
38+
}
39+
}
2240
r.inited = true
2341
return nil
2442
}
2543

2644
func (r *Mock) Free() {
27-
r.inited = false
28-
r.files = nil
29-
}
30-
31-
func (r *Mock) Open(file string) (io.ReadCloser, error) {
3245
if !r.inited {
33-
return nil, fmt.Errorf("not initialized")
34-
}
35-
if content, ok := r.files[file]; ok {
36-
return io.NopCloser(strings.NewReader(content)), nil
46+
panic("not initialized")
3747
}
38-
return nil, os.ErrNotExist
48+
r.inited = false
3949
}
4050

41-
func (r *Mock) OpenFile(_ string, _ int, _ os.FileMode) (io.ReadWriteCloser, error) {
51+
func (r *Mock) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) {
4252
if !r.inited {
4353
return nil, fmt.Errorf("not initialized")
4454
}
45-
return nil, fmt.Errorf("not implemented")
55+
return r.fs.OpenFile(filename, flag, perm)
4656
}
4757

48-
func (r *Mock) OpenForAppend(file string) (io.WriteCloser, error) {
49-
if !r.inited {
50-
return nil, fmt.Errorf("not initialized")
51-
}
52-
if content, ok := r.files[file]; ok {
53-
return &WriteCloserT{r: r, f: file, dt: []byte(content)}, nil
54-
}
55-
return nil, os.ErrNotExist
56-
}
5758

58-
type WriteCloserT struct {
59-
r *Mock
60-
f string
61-
dt []byte
59+
func (r *Mock) Open(filename string) (billy.File, error) {
60+
return r.OpenFile(filename, os.O_RDONLY, 0)
6261
}
6362

64-
func (w *WriteCloserT) Write(p []byte) (n int, err error) {
65-
w.dt = append(w.dt, p...)
66-
return len(p), nil
63+
func (r *Mock) OpenForAppend(filename string) (billy.File, error) {
64+
return r.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
6765
}
6866

69-
func (w *WriteCloserT) Close() error {
70-
w.r.files[w.f] = string(w.dt)
71-
return nil
72-
}
7367

7468
func (r *Mock) CommitPush(_, _, _ string) error {
69+
for fname, _ := range r.Files {
70+
f, err := r.fs.Open(fname)
71+
if err != nil {
72+
return err
73+
}
74+
fc, err := io.ReadAll(f)
75+
76+
if err != nil {
77+
return err
78+
}
79+
80+
r.Files[fname] = string(fc)
81+
82+
err = f.Close()
83+
84+
if err != nil {
85+
return err
86+
}
87+
}
88+
7589
return nil
7690
}

app/repo/repo.go

+16-35
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package repo
22

33
import (
44
"fmt"
5-
"io"
65
"log/slog"
76
"os"
87
"time"
@@ -25,9 +24,9 @@ type Service interface {
2524
// Release the lock and free resources
2625
Free()
2726

28-
Open(file string) (io.ReadCloser, error)
29-
OpenForAppend(file string) (io.WriteCloser, error)
30-
OpenFile(file string, flag int, perm os.FileMode) (io.ReadWriteCloser, error)
27+
OpenFile(file string, flag int, perm os.FileMode) (billy.File, error)
28+
Open(file string) (billy.File, error)
29+
OpenForAppend(file string) (billy.File, error)
3130
CommitPush(msg, name, email string) error
3231
}
3332

@@ -82,37 +81,27 @@ func (imr *InMemoryRepo) Free() {
8281
imr.initedMu.Unlock()
8382
}
8483

85-
func (imr *InMemoryRepo) Open(file string) (io.ReadCloser, error) {
86-
if !imr.inited {
87-
return nil, fmt.Errorf("not initialized")
88-
}
89-
wtr, err := imr.repo.Worktree()
90-
if err != nil {
91-
return nil, fmt.Errorf("worktree receiving error: %v", err)
92-
}
93-
return wtr.Filesystem.Open(file)
84+
func (imr *InMemoryRepo) Open(filename string) (billy.File, error) {
85+
return imr.OpenFile(filename, os.O_RDONLY, 0)
9486
}
9587

96-
type WriteCloser struct {
97-
f *billy.File
98-
r *InMemoryRepo
99-
path string
100-
}
10188

102-
func (w *WriteCloser) Write(p []byte) (n int, err error) {
103-
return (*w.f).Write(p)
89+
func (imr *InMemoryRepo) OpenForAppend(filename string) (billy.File, error) {
90+
return imr.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
10491
}
10592

106-
func (w *WriteCloser) Read(p []byte) (n int, err error) {
107-
return (*w.f).Read(p)
93+
type RepoCloser struct {
94+
billy.File
95+
r *InMemoryRepo
96+
path string
10897
}
10998

110-
func (w *WriteCloser) Close() error {
99+
func (w *RepoCloser) Close() error {
111100
w.r.dirtyFiles[w.path] = true
112-
return (*w.f).Close()
101+
return w.File.Close()
113102
}
114103

115-
func (imr *InMemoryRepo) OpenFile(file string, flag int, perm os.FileMode) (io.ReadWriteCloser, error) {
104+
func (imr *InMemoryRepo) OpenFile(file string, flag int, perm os.FileMode) (billy.File, error) {
116105
if !imr.inited {
117106
return nil, fmt.Errorf("not initialized")
118107
}
@@ -121,23 +110,15 @@ func (imr *InMemoryRepo) OpenFile(file string, flag int, perm os.FileMode) (io.R
121110
return nil, fmt.Errorf("worktree receiving error: %v", err)
122111
}
123112
f, err := wtr.Filesystem.OpenFile(file, flag, perm)
124-
wc := WriteCloser{
113+
wc := RepoCloser{
125114
r: imr,
126115
path: file,
127-
f: &f,
116+
File: f,
128117
}
129118
return &wc, err
130119
}
131120

132121

133-
func (imr *InMemoryRepo) OpenForAppend(file string) (io.WriteCloser, error) {
134-
if !imr.inited {
135-
return nil, fmt.Errorf("not initialized")
136-
}
137-
return imr.OpenFile(file, os.O_APPEND|os.O_WRONLY, 0o666)
138-
}
139-
140-
141122
func (imr *InMemoryRepo) CommitPush(msg, name, email string) error {
142123
if !imr.inited {
143124
return fmt.Errorf("not initialized")

app/teledger/teledger_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ strict: true
117117
(*tldgr.WaitingToBeConfirmedResponses)[resp.PendingKey].Mu.Unlock()
118118
})
119119

120-
r.Files["main.ledger"] = initContent
121-
122120
assert.NotEmpty(t, resp.PendingKey)
123121
_, err := tldgr.ConfirmTransaction(resp.PendingKey)
124122
assert.Empty(t, err)

0 commit comments

Comments
 (0)