Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 5a72b12

Browse files
authored
global storage interface refactor (#112)
* core: ObjectStorage, ReferenceStorage renamed to ObjectStorer and ReferenceStorer * rebase * general, changes request by @alcortes * general, changes request by @alcortes
1 parent aba9ec8 commit 5a72b12

37 files changed

+548
-730
lines changed

blobs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (b *Blob) Encode(o core.Object) error {
6060
}
6161

6262
// Reader returns a reader allow the access to the content of the blob
63-
func (b *Blob) Reader() (core.ObjectReader, error) {
63+
func (b *Blob) Reader() (io.ReadCloser, error) {
6464
return b.obj.Reader()
6565
}
6666

clients/common/common.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,9 @@ func (i *GitUploadPackInfo) Decode(r io.Reader) error {
110110
}
111111

112112
func (i *GitUploadPackInfo) addRefs(ar *advrefs.AdvRefs) error {
113-
i.Refs = make(memory.ReferenceStorage, 0)
114113
for name, hash := range ar.References {
115114
ref := core.NewReferenceFromStrings(name, hash.String())
116-
i.Refs.Set(ref)
115+
i.Refs.SetReference(ref)
117116
}
118117

119118
return i.addSymbolicRefs(ar)
@@ -133,7 +132,7 @@ func (i *GitUploadPackInfo) addSymbolicRefs(ar *advrefs.AdvRefs) error {
133132
name := core.ReferenceName(chunks[0])
134133
target := core.ReferenceName(chunks[1])
135134
ref := core.NewSymbolicReference(name, target)
136-
i.Refs.Set(ref)
135+
i.Refs.SetReference(ref)
137136
}
138137

139138
return nil

commit.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,9 @@ func (c *Commit) Tree() (*Tree, error) {
3737

3838
// Parents return a CommitIter to the parent Commits
3939
func (c *Commit) Parents() *CommitIter {
40-
return NewCommitIter(c.r, core.NewObjectLookupIter(
41-
c.r.s.ObjectStorage(),
42-
core.CommitObject,
43-
c.parents,
44-
))
40+
return NewCommitIter(c.r,
41+
core.NewObjectLookupIter(c.r.s, core.CommitObject, c.parents),
42+
)
4543
}
4644

4745
// NumParents returns the number of parents in a commit.

commit_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (s *SuiteCommit) SetUpSuite(c *C) {
2929

3030
func (s *SuiteCommit) TestDecodeNonCommit(c *C) {
3131
hash := core.NewHash("9a48f23120e880dfbe41f7c9b7b708e9ee62a492")
32-
blob, err := s.Repository.s.ObjectStorage().Get(core.AnyObject, hash)
32+
blob, err := s.Repository.s.Object(core.AnyObject, hash)
3333
c.Assert(err, IsNil)
3434

3535
commit := &Commit{}

common.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ import (
88
"gopkg.in/src-d/go-git.v4/core"
99
)
1010

11-
// Storage storage of objects and references
12-
type Storage interface {
13-
ConfigStorage() config.ConfigStorage
14-
ObjectStorage() core.ObjectStorage
15-
ReferenceStorage() core.ReferenceStorage
11+
// Storer is a generic storage of objects, references and any information
12+
// related to a particular repository. Some Storer implementations persist the
13+
// information in an system directory (such as `.git`) and others
14+
// implementations are in memmory being ephemeral
15+
type Storer interface {
16+
core.ObjectStorer
17+
core.ReferenceStorer
18+
config.ConfigStorer
1619
}
1720

1821
// countLines returns the number of lines in a string à la git, this is
@@ -52,4 +55,5 @@ func checkClose(c io.Closer, err *error) {
5255
}
5356
}
5457

58+
// DateFormat is the format being use in the orignal git implementation
5559
const DateFormat = "Mon Jan 02 15:04:05 2006 -0700"

common_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (s *BaseSuite) buildRepositories(c *C, f fixtures.Fixtures) {
5757
defer f.Close()
5858

5959
n := packfile.NewScanner(f)
60-
d, err := packfile.NewDecoder(n, r.s.ObjectStorage())
60+
d, err := packfile.NewDecoder(n, r.s)
6161
c.Assert(err, IsNil)
6262
_, err = d.Decode()
6363
c.Assert(err, IsNil)
@@ -155,7 +155,7 @@ func unpackFixtures(c *C, fixtures ...[]packedFixture) map[string]*Repository {
155155
c.Assert(err, IsNil, comment)
156156

157157
r := packfile.NewScanner(f)
158-
d, err := packfile.NewDecoder(r, repos[fixture.url].s.ObjectStorage())
158+
d, err := packfile.NewDecoder(r, repos[fixture.url].s)
159159
c.Assert(err, IsNil, comment)
160160
_, err = d.Decode()
161161
c.Assert(err, IsNil, comment)

config/config.go

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,51 @@ import (
77
)
88

99
const (
10+
// DefaultRefSpec is the default refspec used, when none is given
1011
DefaultRefSpec = "+refs/heads/*:refs/remotes/%s/*"
1112
)
1213

14+
// ConfigStorer interface to persist Config objects
15+
type ConfigStorer interface {
16+
Config() (*Config, error)
17+
SetConfig(*Config) error
18+
}
19+
1320
var (
21+
ErrInvalid = errors.New("config invalid remote")
1422
ErrRemoteConfigNotFound = errors.New("remote config not found")
1523
ErrRemoteConfigEmptyURL = errors.New("remote config: empty URL")
1624
ErrRemoteConfigEmptyName = errors.New("remote config: empty name")
1725
)
1826

19-
type ConfigStorage interface {
20-
Remote(name string) (*RemoteConfig, error)
21-
Remotes() ([]*RemoteConfig, error)
22-
SetRemote(*RemoteConfig) error
23-
DeleteRemote(name string) error
27+
// Config contains the repository configuration
28+
type Config struct {
29+
Remotes map[string]*RemoteConfig
30+
}
31+
32+
// NewConfig returns a new empty Config
33+
func NewConfig() *Config {
34+
return &Config{
35+
Remotes: make(map[string]*RemoteConfig, 0),
36+
}
37+
}
38+
39+
// Validate validate the fields and set the default values
40+
func (c *Config) Validate() error {
41+
for name, r := range c.Remotes {
42+
if r.Name != name {
43+
return ErrInvalid
44+
}
45+
46+
if err := r.Validate(); err != nil {
47+
return err
48+
}
49+
}
50+
51+
return nil
2452
}
2553

54+
// RemoteConfig contains the configuration for a given repository
2655
type RemoteConfig struct {
2756
Name string
2857
URL string

config/config_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,26 @@ type ConfigSuite struct{}
66

77
var _ = Suite(&ConfigSuite{})
88

9+
func (s *ConfigSuite) TestConfigValidateInvalidRemote(c *C) {
10+
config := &Config{
11+
Remotes: map[string]*RemoteConfig{
12+
"foo": {Name: "foo"},
13+
},
14+
}
15+
16+
c.Assert(config.Validate(), Equals, ErrRemoteConfigEmptyURL)
17+
}
18+
19+
func (s *ConfigSuite) TestConfigValidateInvalidKey(c *C) {
20+
config := &Config{
21+
Remotes: map[string]*RemoteConfig{
22+
"bar": {Name: "foo"},
23+
},
24+
}
25+
26+
c.Assert(config.Validate(), Equals, ErrInvalid)
27+
}
28+
929
func (s *ConfigSuite) TestRemoteConfigValidateMissingURL(c *C) {
1030
config := &RemoteConfig{Name: "foo"}
1131
c.Assert(config.Validate(), Equals, ErrRemoteConfigEmptyURL)

core/memory.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package core
1+
package core
22

33
import (
44
"bytes"
5+
"io"
56
"io/ioutil"
67
)
78

@@ -39,12 +40,12 @@ func (o *MemoryObject) Size() int64 { return o.sz }
3940
func (o *MemoryObject) SetSize(s int64) { o.sz = s }
4041

4142
// Reader returns a ObjectReader used to read the object's content.
42-
func (o *MemoryObject) Reader() (ObjectReader, error) {
43+
func (o *MemoryObject) Reader() (io.ReadCloser, error) {
4344
return ioutil.NopCloser(bytes.NewBuffer(o.cont)), nil
4445
}
4546

4647
// Writer returns a ObjectWriter used to write the object's content.
47-
func (o *MemoryObject) Writer() (ObjectWriter, error) {
48+
func (o *MemoryObject) Writer() (io.WriteCloser, error) {
4849
return o, nil
4950
}
5051

core/object.go

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,15 @@ var (
1212
ErrInvalidType = errors.New("invalid object type")
1313
)
1414

15-
// TODO: Consider adding a Hash function to the ObjectReader and ObjectWriter
16-
// interfaces that returns the hash calculated for the reader or writer.
17-
18-
// ObjectReader is a generic representation of an object reader.
19-
//
20-
// ObjectReader implements io.ReadCloser. Close should be called when finished
21-
// with it.
22-
type ObjectReader io.ReadCloser
23-
24-
// ObjectWriter is a generic representation of an object writer.
25-
//
26-
// ObjectWriter implements io.WriterCloser. Close should be called when finished
27-
// with it.
28-
type ObjectWriter io.WriteCloser
29-
3015
// Object is a generic representation of any git object
3116
type Object interface {
3217
Hash() Hash
3318
Type() ObjectType
3419
SetType(ObjectType)
3520
Size() int64
3621
SetSize(int64)
37-
Reader() (ObjectReader, error)
38-
Writer() (ObjectWriter, error)
22+
Reader() (io.ReadCloser, error)
23+
Writer() (io.WriteCloser, error)
3924
}
4025

4126
// ObjectType internal object type
@@ -116,15 +101,15 @@ func ParseObjectType(value string) (typ ObjectType, err error) {
116101
// The ObjectLookupIter must be closed with a call to Close() when it is no
117102
// longer needed.
118103
type ObjectLookupIter struct {
119-
storage ObjectStorage
104+
storage ObjectStorer
120105
series []Hash
121106
t ObjectType
122107
pos int
123108
}
124109

125110
// NewObjectLookupIter returns an object iterator given an object storage and
126111
// a slice of object hashes.
127-
func NewObjectLookupIter(storage ObjectStorage, t ObjectType, series []Hash) *ObjectLookupIter {
112+
func NewObjectLookupIter(storage ObjectStorer, t ObjectType, series []Hash) *ObjectLookupIter {
128113
return &ObjectLookupIter{
129114
storage: storage,
130115
series: series,
@@ -142,7 +127,7 @@ func (iter *ObjectLookupIter) Next() (Object, error) {
142127
}
143128

144129
hash := iter.series[iter.pos]
145-
obj, err := iter.storage.Get(iter.t, hash)
130+
obj, err := iter.storage.Object(iter.t, hash)
146131
if err == nil {
147132
iter.pos++
148133
}

core/object_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,18 @@ func (o *MockObjectStorage) NewObject() Object {
159159
return nil
160160
}
161161

162-
func (o *MockObjectStorage) Set(obj Object) (Hash, error) {
162+
func (o *MockObjectStorage) SetObject(obj Object) (Hash, error) {
163163
return ZeroHash, nil
164164
}
165165

166-
func (o *MockObjectStorage) Get(t ObjectType, h Hash) (Object, error) {
166+
func (o *MockObjectStorage) Object(t ObjectType, h Hash) (Object, error) {
167167
return &MemoryObject{h: h}, nil
168168
}
169169

170-
func (o *MockObjectStorage) Iter(t ObjectType) (ObjectIter, error) {
170+
func (o *MockObjectStorage) IterObjects(t ObjectType) (ObjectIter, error) {
171171
return nil, nil
172172
}
173173

174-
func (o *MockObjectStorage) Begin() TxObjectStorage {
174+
func (o *MockObjectStorage) Begin() Transaction {
175175
return nil
176176
}

core/reference.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,15 +203,15 @@ func (iter *ReferenceSliceIter) Close() {
203203
iter.pos = len(iter.series)
204204
}
205205

206-
func ResolveReference(s ReferenceStorage, n ReferenceName) (*Reference, error) {
207-
r, err := s.Get(n)
206+
func ResolveReference(s ReferenceStorer, n ReferenceName) (*Reference, error) {
207+
r, err := s.Reference(n)
208208
if err != nil || r == nil {
209209
return r, err
210210
}
211211
return resolveReference(s, r, 0)
212212
}
213213

214-
func resolveReference(s ReferenceStorage, r *Reference, recursion int) (*Reference, error) {
214+
func resolveReference(s ReferenceStorer, r *Reference, recursion int) (*Reference, error) {
215215
if r.Type() != SymbolicReference {
216216
return r, nil
217217
}
@@ -220,7 +220,7 @@ func resolveReference(s ReferenceStorage, r *Reference, recursion int) (*Referen
220220
return nil, ErrMaxResolveRecursion
221221
}
222222

223-
t, err := s.Get(r.Target())
223+
t, err := s.Reference(r.Target())
224224
if err != nil {
225225
return nil, err
226226
}

0 commit comments

Comments
 (0)