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

Commit 3cce02e

Browse files
committed
storage/memory: implemented ReferenceStorage and Storage
1 parent 8e2d39a commit 3cce02e

File tree

2 files changed

+183
-21
lines changed

2 files changed

+183
-21
lines changed

storage/memory/storage.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,31 @@ import (
88

99
var ErrUnsupportedObjectType = fmt.Errorf("unsupported object type")
1010

11+
type Storage struct {
12+
o *ObjectStorage
13+
r *ReferenceStorage
14+
}
15+
16+
func NewStorage() *Storage {
17+
return &Storage{}
18+
}
19+
20+
func (s *Storage) ObjectStorage() core.ObjectStorage {
21+
if s.o == nil {
22+
s.o = NewObjectStorage()
23+
}
24+
25+
return s.o
26+
}
27+
28+
func (s *Storage) ReferenceStorage() core.ReferenceStorage {
29+
if s.r == nil {
30+
s.r = NewReferenceStorage()
31+
}
32+
33+
return s.r
34+
}
35+
1136
// ObjectStorage is the implementation of core.ObjectStorage for memory.Object
1237
type ObjectStorage struct {
1338
Objects map[core.Hash]core.Object
@@ -77,6 +102,7 @@ func (o *ObjectStorage) Iter(t core.ObjectType) (core.ObjectIter, error) {
77102
case core.TagObject:
78103
series = flattenObjectMap(o.Tags)
79104
}
105+
80106
return core.NewObjectSliceIter(series), nil
81107
}
82108

@@ -87,3 +113,37 @@ func flattenObjectMap(m map[core.Hash]core.Object) []core.Object {
87113
}
88114
return objects
89115
}
116+
117+
type ReferenceStorage map[core.ReferenceName]*core.Reference
118+
119+
func NewReferenceStorage() *ReferenceStorage {
120+
s := make(ReferenceStorage, 0)
121+
122+
return &s
123+
}
124+
125+
func (r ReferenceStorage) Set(ref *core.Reference) error {
126+
if ref != nil {
127+
r[ref.Name()] = ref
128+
}
129+
130+
return nil
131+
}
132+
133+
func (r ReferenceStorage) Get(n core.ReferenceName) (*core.Reference, error) {
134+
ref, ok := r[n]
135+
if !ok {
136+
return nil, core.ErrReferenceNotFound
137+
}
138+
139+
return ref, nil
140+
}
141+
142+
func (r ReferenceStorage) Iter() (core.ReferenceIter, error) {
143+
var refs []*core.Reference
144+
for _, ref := range r {
145+
refs = append(refs, ref)
146+
}
147+
148+
return core.NewReferenceSliceIter(refs), nil
149+
}

storage/memory/storage_test.go

Lines changed: 123 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package memory
22

33
import (
4+
"io"
45
"testing"
56

67
. "gopkg.in/check.v1"
@@ -9,46 +10,147 @@ import (
910

1011
func Test(t *testing.T) { TestingT(t) }
1112

12-
type ObjectStorageSuite struct{}
13+
type StorageSuite struct{}
1314

14-
var _ = Suite(&ObjectStorageSuite{})
15+
var _ = Suite(&StorageSuite{})
1516

16-
func (s *ObjectStorageSuite) TestSet(c *C) {
17+
func (s *StorageSuite) TestStorageObjectStorage(c *C) {
18+
storage := NewStorage()
19+
o := storage.ObjectStorage()
20+
e := storage.ObjectStorage()
21+
22+
c.Assert(o == e, Equals, true)
23+
}
24+
25+
func (s *StorageSuite) TestStorageReferenceStorage(c *C) {
26+
storage := NewStorage()
27+
o := storage.ReferenceStorage()
28+
e := storage.ReferenceStorage()
29+
30+
c.Assert(o == e, Equals, true)
31+
}
32+
33+
func (s *StorageSuite) TestObjectStorageSetAndGet(c *C) {
1734
os := NewObjectStorage()
1835

19-
o := &core.MemoryObject{}
20-
o.SetType(core.CommitObject)
21-
o.SetSize(3)
36+
commit := &core.MemoryObject{}
37+
commit.SetType(core.CommitObject)
2238

23-
writer, err := o.Writer()
39+
h, err := os.Set(commit)
2440
c.Assert(err, IsNil)
25-
defer func() { c.Assert(writer.Close(), IsNil) }()
41+
c.Assert(h.String(), Equals, "dcf5b16e76cce7425d0beaef62d79a7d10fce1f5")
42+
43+
e, err := os.Get(h)
44+
c.Assert(commit == e, Equals, true)
45+
46+
tree := &core.MemoryObject{}
47+
tree.SetType(core.TreeObject)
48+
49+
h, err = os.Set(tree)
50+
c.Assert(err, IsNil)
51+
c.Assert(h.String(), Equals, "4b825dc642cb6eb9a060e54bf8d69288fbee4904")
52+
53+
e, err = os.Get(h)
54+
c.Assert(tree == e, Equals, true)
2655

27-
writer.Write([]byte("foo"))
56+
blob := &core.MemoryObject{}
57+
blob.SetType(core.BlobObject)
2858

29-
h, err := os.Set(o)
59+
h, err = os.Set(blob)
3060
c.Assert(err, IsNil)
31-
c.Assert(h.String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
61+
c.Assert(h.String(), Equals, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")
62+
63+
e, err = os.Get(h)
64+
c.Assert(blob == e, Equals, true)
65+
66+
tag := &core.MemoryObject{}
67+
tag.SetType(core.TagObject)
68+
69+
h, err = os.Set(tag)
70+
c.Assert(err, IsNil)
71+
c.Assert(h.String(), Equals, "d994c6bb648123a17e8f70a966857c546b2a6f94")
72+
73+
e, err = os.Get(h)
74+
c.Assert(tag == e, Equals, true)
3275
}
3376

34-
func (s *ObjectStorageSuite) TestGet(c *C) {
77+
func (s *StorageSuite) TestObjectStorageIter(c *C) {
78+
commit := &core.MemoryObject{}
79+
commit.SetType(core.CommitObject)
80+
tree := &core.MemoryObject{}
81+
tree.SetType(core.TreeObject)
82+
blob := &core.MemoryObject{}
83+
blob.SetType(core.BlobObject)
84+
tag := &core.MemoryObject{}
85+
tag.SetType(core.TagObject)
86+
3587
os := NewObjectStorage()
88+
os.Set(commit)
89+
os.Set(tree)
90+
os.Set(blob)
91+
os.Set(tag)
92+
93+
i, err := os.Iter(core.CommitObject)
94+
c.Assert(err, IsNil)
95+
96+
e, err := i.Next()
97+
c.Assert(err, IsNil)
98+
c.Assert(commit == e, Equals, true)
3699

37-
o := &core.MemoryObject{}
38-
o.SetType(core.CommitObject)
39-
o.SetSize(3)
100+
i, err = os.Iter(core.TreeObject)
101+
c.Assert(err, IsNil)
102+
103+
e, err = i.Next()
104+
c.Assert(err, IsNil)
105+
c.Assert(tree == e, Equals, true)
40106

41-
writer, err := o.Writer()
107+
i, err = os.Iter(core.BlobObject)
42108
c.Assert(err, IsNil)
43-
defer func() { c.Assert(writer.Close(), IsNil) }()
44109

45-
writer.Write([]byte("foo"))
110+
e, err = i.Next()
111+
c.Assert(err, IsNil)
112+
c.Assert(blob == e, Equals, true)
113+
114+
i, err = os.Iter(core.TagObject)
115+
c.Assert(err, IsNil)
116+
117+
e, err = i.Next()
118+
c.Assert(err, IsNil)
119+
c.Assert(tag == e, Equals, true)
120+
121+
e, err = i.Next()
122+
c.Assert(e, IsNil)
123+
c.Assert(err, Equals, io.EOF)
124+
}
125+
126+
func (s *StorageSuite) TestReferenceStorageSetAndGet(c *C) {
127+
rs := NewReferenceStorage()
128+
129+
err := rs.Set(core.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"))
130+
c.Assert(err, IsNil)
131+
132+
err = rs.Set(core.NewReferenceFromStrings("bar", "482e0eada5de4039e6f216b45b3c9b683b83bfa"))
133+
c.Assert(err, IsNil)
134+
135+
e, err := rs.Get(core.ReferenceName("foo"))
136+
c.Assert(err, IsNil)
137+
c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
138+
}
139+
140+
func (s *StorageSuite) TestReferenceStorageIter(c *C) {
141+
rs := NewReferenceStorage()
142+
143+
err := rs.Set(core.NewReferenceFromStrings("foo", "bc9968d75e48de59f0870ffb71f5e160bbbdcf52"))
144+
c.Assert(err, IsNil)
46145

47-
h, err := os.Set(o)
146+
i, err := rs.Iter()
48147
c.Assert(err, IsNil)
49148

50-
ro, err := os.Get(h)
149+
e, err := i.Next()
51150
c.Assert(err, IsNil)
151+
c.Assert(e.Hash().String(), Equals, "bc9968d75e48de59f0870ffb71f5e160bbbdcf52")
52152

53-
c.Assert(ro, DeepEquals, o)
153+
e, err = i.Next()
154+
c.Assert(e, IsNil)
155+
c.Assert(err, Equals, io.EOF)
54156
}

0 commit comments

Comments
 (0)