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

Commit ff04a1d

Browse files
committed
storage: transactional, new storage with transactional capabilities (WIP)
Signed-off-by: Máximo Cuadros <mcuadros@gmail.com>
1 parent f22a5cb commit ff04a1d

File tree

6 files changed

+290
-1
lines changed

6 files changed

+290
-1
lines changed

plumbing/storer/object.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ type MultiEncodedObjectIter struct {
222222
}
223223

224224
// NewMultiEncodedObjectIter returns an object iterator for the given slice of
225-
// objects.
225+
// EncodedObjectIters.
226226
func NewMultiEncodedObjectIter(iters []EncodedObjectIter) EncodedObjectIter {
227227
return &MultiEncodedObjectIter{iters: iters}
228228
}

storage/transactional/config.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package transactional
2+
3+
import "gopkg.in/src-d/go-git.v4/config"
4+
5+
type ConfigStorage struct {
6+
config.ConfigStorer
7+
temporal config.ConfigStorer
8+
9+
set bool
10+
}
11+
12+
func NewConfigStorage(s, temporal config.ConfigStorer) *ConfigStorage {
13+
return &ConfigStorage{ConfigStorer: s, temporal: temporal}
14+
}
15+
16+
func (c *ConfigStorage) SetConfig(cfg *config.Config) error {
17+
if err := c.temporal.SetConfig(cfg); err != nil {
18+
return err
19+
}
20+
21+
c.set = true
22+
return nil
23+
}
24+
25+
func (c *ConfigStorage) Commit() error {
26+
if !c.set {
27+
return nil
28+
}
29+
30+
cfg, err := c.temporal.Config()
31+
if err != nil {
32+
return err
33+
}
34+
35+
return c.ConfigStorer.SetConfig(cfg)
36+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package transactional
2+
3+
import (
4+
"testing"
5+
6+
. "gopkg.in/check.v1"
7+
"gopkg.in/src-d/go-git.v4/config"
8+
"gopkg.in/src-d/go-git.v4/storage/memory"
9+
)
10+
11+
func Test(t *testing.T) { TestingT(t) }
12+
13+
var _ = Suite(&ConfigSuite{})
14+
15+
type ConfigSuite struct{}
16+
17+
func (s *ConfigSuite) TestSetConfig(c *C) {
18+
cfg := config.NewConfig()
19+
cfg.Core.Worktree = "foo"
20+
21+
base := memory.NewStorage()
22+
err := base.SetConfig(cfg)
23+
c.Assert(err, IsNil)
24+
25+
temporal := memory.NewStorage()
26+
27+
cfg = config.NewConfig()
28+
cfg.Core.Worktree = "bar"
29+
30+
cs := NewConfigStorage(base, temporal)
31+
err = cs.SetConfig(cfg)
32+
c.Assert(err, IsNil)
33+
34+
baseCfg, err := base.Config()
35+
c.Assert(err, IsNil)
36+
c.Assert(baseCfg.Core.Worktree, Equals, "foo")
37+
38+
temporalCfg, err := temporal.Config()
39+
c.Assert(err, IsNil)
40+
c.Assert(temporalCfg.Core.Worktree, Equals, "bar")
41+
42+
cfg, err = cs.Config()
43+
c.Assert(err, IsNil)
44+
c.Assert(temporalCfg.Core.Worktree, Equals, "bar")
45+
}
46+
47+
func (s *ConfigSuite) TestCommit(c *C) {
48+
cfg := config.NewConfig()
49+
cfg.Core.Worktree = "foo"
50+
51+
base := memory.NewStorage()
52+
err := base.SetConfig(cfg)
53+
c.Assert(err, IsNil)
54+
55+
temporal := memory.NewStorage()
56+
57+
cfg = config.NewConfig()
58+
cfg.Core.Worktree = "bar"
59+
60+
cs := NewConfigStorage(base, temporal)
61+
err = cs.SetConfig(cfg)
62+
c.Assert(err, IsNil)
63+
64+
err = cs.Commit()
65+
c.Assert(err, IsNil)
66+
67+
baseCfg, err := base.Config()
68+
c.Assert(err, IsNil)
69+
c.Assert(baseCfg.Core.Worktree, Equals, "bar")
70+
}

storage/transactional/object.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package transactional
2+
3+
import (
4+
"gopkg.in/src-d/go-git.v4/plumbing"
5+
"gopkg.in/src-d/go-git.v4/plumbing/storer"
6+
)
7+
8+
type ObjectStorage struct {
9+
storer.EncodedObjectStorer
10+
temporal storer.EncodedObjectStorer
11+
}
12+
13+
func NewObjectStorage(s, temporal storer.EncodedObjectStorer) *ObjectStorage {
14+
return &ObjectStorage{EncodedObjectStorer: s, temporal: temporal}
15+
}
16+
17+
func (o *ObjectStorage) SetEncodedObject(obj plumbing.EncodedObject) (plumbing.Hash, error) {
18+
return o.temporal.SetEncodedObject(obj)
19+
}
20+
21+
func (o *ObjectStorage) HasEncodedObject(h plumbing.Hash) error {
22+
err := o.EncodedObjectStorer.HasEncodedObject(h)
23+
if err == plumbing.ErrObjectNotFound {
24+
return o.temporal.HasEncodedObject(h)
25+
}
26+
27+
return err
28+
}
29+
30+
func (o *ObjectStorage) EncodedObjectSize(h plumbing.Hash) (int64, error) {
31+
sz, err := o.EncodedObjectStorer.EncodedObjectSize(h)
32+
if err == plumbing.ErrObjectNotFound {
33+
return o.temporal.EncodedObjectSize(h)
34+
}
35+
36+
return sz, err
37+
}
38+
39+
func (o *ObjectStorage) EncodedObject(t plumbing.ObjectType, h plumbing.Hash) (plumbing.EncodedObject, error) {
40+
obj, err := o.EncodedObjectStorer.EncodedObject(t, h)
41+
if err == plumbing.ErrObjectNotFound {
42+
return o.temporal.EncodedObject(t, h)
43+
}
44+
45+
return obj, err
46+
}
47+
48+
func (o *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.EncodedObjectIter, error) {
49+
baseIter, err := o.EncodedObjectStorer.IterEncodedObjects(t)
50+
if err != nil {
51+
return nil, err
52+
}
53+
54+
temporalIter, err := o.temporal.IterEncodedObjects(t)
55+
if err != nil {
56+
return nil, err
57+
}
58+
59+
return storer.NewMultiEncodedObjectIter([]storer.EncodedObjectIter{
60+
baseIter,
61+
temporalIter,
62+
}), nil
63+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package transactional
2+
3+
import (
4+
. "gopkg.in/check.v1"
5+
"gopkg.in/src-d/go-git.v4/plumbing"
6+
"gopkg.in/src-d/go-git.v4/storage/memory"
7+
)
8+
9+
var _ = Suite(&ObjectSuite{})
10+
11+
type ObjectSuite struct{}
12+
13+
func (s *ObjectSuite) TestHasEncodedObject(c *C) {
14+
base := memory.NewStorage()
15+
temporal := memory.NewStorage()
16+
17+
os := NewObjectStorage(base, temporal)
18+
19+
commit := base.NewEncodedObject()
20+
commit.SetType(plumbing.CommitObject)
21+
22+
ch, err := base.SetEncodedObject(commit)
23+
c.Assert(ch.IsZero(), Equals, false)
24+
c.Assert(err, IsNil)
25+
26+
tree := base.NewEncodedObject()
27+
tree.SetType(plumbing.TreeObject)
28+
29+
th, err := os.SetEncodedObject(tree)
30+
c.Assert(th.IsZero(), Equals, false)
31+
c.Assert(err, IsNil)
32+
33+
err = os.HasEncodedObject(th)
34+
c.Assert(err, IsNil)
35+
36+
err = os.HasEncodedObject(ch)
37+
c.Assert(err, IsNil)
38+
39+
err = base.HasEncodedObject(th)
40+
c.Assert(err, Equals, plumbing.ErrObjectNotFound)
41+
}
42+
43+
func (s *ObjectSuite) TestEncodedObjectAndEncodedObjectSize(c *C) {
44+
base := memory.NewStorage()
45+
temporal := memory.NewStorage()
46+
47+
os := NewObjectStorage(base, temporal)
48+
49+
commit := base.NewEncodedObject()
50+
commit.SetType(plumbing.CommitObject)
51+
52+
ch, err := base.SetEncodedObject(commit)
53+
c.Assert(ch.IsZero(), Equals, false)
54+
c.Assert(err, IsNil)
55+
56+
tree := base.NewEncodedObject()
57+
tree.SetType(plumbing.TreeObject)
58+
59+
th, err := os.SetEncodedObject(tree)
60+
c.Assert(th.IsZero(), Equals, false)
61+
c.Assert(err, IsNil)
62+
63+
otree, err := os.EncodedObject(plumbing.TreeObject, th)
64+
c.Assert(err, IsNil)
65+
c.Assert(otree.Hash(), Equals, tree.Hash())
66+
67+
treeSz, err := os.EncodedObjectSize(th)
68+
c.Assert(err, IsNil)
69+
c.Assert(treeSz, Equals, int64(0))
70+
71+
ocommit, err := os.EncodedObject(plumbing.CommitObject, ch)
72+
c.Assert(err, IsNil)
73+
c.Assert(ocommit.Hash(), Equals, commit.Hash())
74+
75+
commitSz, err := os.EncodedObjectSize(ch)
76+
c.Assert(err, IsNil)
77+
c.Assert(commitSz, Equals, int64(0))
78+
79+
_, err = base.EncodedObject(plumbing.TreeObject, th)
80+
c.Assert(err, Equals, plumbing.ErrObjectNotFound)
81+
82+
_, err = base.EncodedObjectSize(th)
83+
c.Assert(err, Equals, plumbing.ErrObjectNotFound)
84+
}
85+
86+
func (s *ObjectSuite) TestIterEncodedObjects(c *C) {
87+
base := memory.NewStorage()
88+
temporal := memory.NewStorage()
89+
90+
os := NewObjectStorage(base, temporal)
91+
92+
commit := base.NewEncodedObject()
93+
commit.SetType(plumbing.CommitObject)
94+
95+
ch, err := base.SetEncodedObject(commit)
96+
c.Assert(ch.IsZero(), Equals, false)
97+
c.Assert(err, IsNil)
98+
99+
tree := base.NewEncodedObject()
100+
tree.SetType(plumbing.TreeObject)
101+
102+
th, err := os.SetEncodedObject(tree)
103+
c.Assert(th.IsZero(), Equals, false)
104+
c.Assert(err, IsNil)
105+
106+
iter, err := os.IterEncodedObjects(plumbing.AnyObject)
107+
c.Assert(err, IsNil)
108+
109+
var hashes []plumbing.Hash
110+
err = iter.ForEach(func(obj plumbing.EncodedObject) error {
111+
hashes = append(hashes, obj.Hash())
112+
return nil
113+
})
114+
115+
c.Assert(err, IsNil)
116+
c.Assert(hashes, HasLen, 2)
117+
c.Assert(hashes[0], Equals, ch)
118+
c.Assert(hashes[1], Equals, th)
119+
}

storage/transactional/storage.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package transactional

0 commit comments

Comments
 (0)