diff options
-rw-r--r-- | storage/transactional/storage.go | 43 | ||||
-rw-r--r-- | storage/transactional/storage_test.go | 33 |
2 files changed, 67 insertions, 9 deletions
diff --git a/storage/transactional/storage.go b/storage/transactional/storage.go index fbb3d35..b81b104 100644 --- a/storage/transactional/storage.go +++ b/storage/transactional/storage.go @@ -1,6 +1,9 @@ package transactional import ( + "io" + + "gopkg.in/src-d/go-git.v4/plumbing/storer" "gopkg.in/src-d/go-git.v4/storage" ) @@ -10,7 +13,13 @@ import ( // // The API and functionality of this package are considered EXPERIMENTAL and is // not considered stable nor production ready. -type Storage struct { +type Storage interface { + storage.Storer + Commit() error +} + +// basic implements the Storage interface. +type basic struct { s, temporal storage.Storer *ObjectStorage @@ -20,11 +29,18 @@ type Storage struct { *ConfigStorage } +// packageWriter implements storer.PackfileWriter interface over +// a Storage with a temporal storer that supports it. +type packageWriter struct { + *basic + pw storer.PackfileWriter +} + // NewStorage returns a new Storage based on two repositories, base is the base -// repository where the read operations are read and temportal is were all +// repository where the read operations are read and temporal is were all // the write operations are stored. -func NewStorage(base, temporal storage.Storer) *Storage { - return &Storage{ +func NewStorage(base, temporal storage.Storer) Storage { + st := &basic{ s: base, temporal: temporal, @@ -34,10 +50,20 @@ func NewStorage(base, temporal storage.Storer) *Storage { ShallowStorage: NewShallowStorage(base, temporal), ConfigStorage: NewConfigStorage(base, temporal), } + + pw, ok := temporal.(storer.PackfileWriter) + if ok { + return &packageWriter{ + basic: st, + pw: pw, + } + } + + return st } // Module it honors the storage.ModuleStorer interface. -func (s *Storage) Module(name string) (storage.Storer, error) { +func (s *basic) Module(name string) (storage.Storer, error) { base, err := s.s.Module(name) if err != nil { return nil, err @@ -52,7 +78,7 @@ func (s *Storage) Module(name string) (storage.Storer, error) { } // Commit it copies the content of the temporal storage into the base storage. -func (s *Storage) Commit() error { +func (s *basic) Commit() error { for _, c := range []interface{ Commit() error }{ s.ObjectStorage, s.ReferenceStorage, @@ -67,3 +93,8 @@ func (s *Storage) Commit() error { return nil } + +// PackfileWriter honors storage.PackfileWriter. +func (s *packageWriter) PackfileWriter() (io.WriteCloser, error) { + return s.pw.PackfileWriter() +} diff --git a/storage/transactional/storage_test.go b/storage/transactional/storage_test.go index 6aaea0d..63ebfb1 100644 --- a/storage/transactional/storage_test.go +++ b/storage/transactional/storage_test.go @@ -4,7 +4,12 @@ import ( "testing" . "gopkg.in/check.v1" + "gopkg.in/src-d/go-billy.v4/memfs" "gopkg.in/src-d/go-git.v4/plumbing" + "gopkg.in/src-d/go-git.v4/plumbing/cache" + "gopkg.in/src-d/go-git.v4/plumbing/storer" + "gopkg.in/src-d/go-git.v4/storage" + "gopkg.in/src-d/go-git.v4/storage/filesystem" "gopkg.in/src-d/go-git.v4/storage/memory" "gopkg.in/src-d/go-git.v4/storage/test" ) @@ -13,13 +18,25 @@ func Test(t *testing.T) { TestingT(t) } type StorageSuite struct { test.BaseStorageSuite + temporal func() storage.Storer } -var _ = Suite(&StorageSuite{}) +var _ = Suite(&StorageSuite{ + temporal: func() storage.Storer { + return memory.NewStorage() + }, +}) + +var _ = Suite(&StorageSuite{ + temporal: func() storage.Storer { + fs := memfs.New() + return filesystem.NewStorage(fs, cache.NewObjectLRUDefault()) + }, +}) func (s *StorageSuite) SetUpTest(c *C) { base := memory.NewStorage() - temporal := memory.NewStorage() + temporal := s.temporal() s.BaseStorageSuite = test.NewBaseStorageSuite(NewStorage(base, temporal)) s.BaseStorageSuite.SetUpTest(c) @@ -27,7 +44,7 @@ func (s *StorageSuite) SetUpTest(c *C) { func (s *StorageSuite) TestCommit(c *C) { base := memory.NewStorage() - temporal := memory.NewStorage() + temporal := s.temporal() st := NewStorage(base, temporal) commit := base.NewEncodedObject() @@ -50,3 +67,13 @@ func (s *StorageSuite) TestCommit(c *C) { c.Assert(err, IsNil) c.Assert(obj.Hash(), Equals, commit.Hash()) } + +func (s *StorageSuite) TestTransactionalPackfileWriter(c *C) { + base := memory.NewStorage() + temporal := s.temporal() + st := NewStorage(base, temporal) + + _, tmpOK := temporal.(storer.PackfileWriter) + _, ok := st.(storer.PackfileWriter) + c.Assert(ok, Equals, tmpOK) +} |