aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plumbing/storer/storer.go8
-rw-r--r--repository.go13
-rw-r--r--storage/filesystem/internal/dotgit/dotgit.go2
-rw-r--r--storage/filesystem/storage.go10
-rw-r--r--storage/filesystem/storage_test.go19
5 files changed, 37 insertions, 15 deletions
diff --git a/plumbing/storer/storer.go b/plumbing/storer/storer.go
index 0b96c0e..863070d 100644
--- a/plumbing/storer/storer.go
+++ b/plumbing/storer/storer.go
@@ -5,3 +5,11 @@ type Storer interface {
EncodedObjectStorer
ReferenceStorer
}
+
+// Initializer should be implemented by storers that require to perform any
+// operation when creating a new repository (i.e. git init).
+type Initializer interface{
+ // Init performs initialization of the storer and returns the error, if
+ // any.
+ Init() error
+}
diff --git a/repository.go b/repository.go
index 76be660..35aae52 100644
--- a/repository.go
+++ b/repository.go
@@ -44,6 +44,10 @@ type Repository struct {
// The worktree Filesystem is optional, if nil a bare repository is created. If
// the given storer is not empty ErrRepositoryAlreadyExists is returned
func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) {
+ if err := initStorer(s); err != nil {
+ return nil, err
+ }
+
r := newRepository(s, worktree)
_, err := r.Reference(plumbing.HEAD, false)
switch err {
@@ -67,6 +71,15 @@ func Init(s storage.Storer, worktree billy.Filesystem) (*Repository, error) {
return r, setWorktreeAndStoragePaths(r, worktree)
}
+func initStorer(s storer.Storer) error {
+ i, ok := s.(storer.Initializer)
+ if !ok {
+ return nil
+ }
+
+ return i.Init()
+}
+
func setWorktreeAndStoragePaths(r *Repository, worktree billy.Filesystem) error {
type fsBased interface {
Filesystem() billy.Filesystem
diff --git a/storage/filesystem/internal/dotgit/dotgit.go b/storage/filesystem/internal/dotgit/dotgit.go
index f9f4d79..1af64ab 100644
--- a/storage/filesystem/internal/dotgit/dotgit.go
+++ b/storage/filesystem/internal/dotgit/dotgit.go
@@ -231,7 +231,7 @@ func (d *DotGit) Objects() ([]plumbing.Hash, error) {
return objects, nil
}
-// Object return a fs.File poiting the object file, if exists
+// Object return a fs.File pointing the object file, if exists
func (d *DotGit) Object(h plumbing.Hash) (billy.File, error) {
hash := h.String()
file := d.fs.Join(objectsPath, hash[0:2], hash[2:40])
diff --git a/storage/filesystem/storage.go b/storage/filesystem/storage.go
index dcb061d..af340d7 100644
--- a/storage/filesystem/storage.go
+++ b/storage/filesystem/storage.go
@@ -12,6 +12,7 @@ import (
// are not safe to use, see the NewStorage function below.
type Storage struct {
fs billy.Filesystem
+ dir *dotgit.DotGit
ObjectStorage
ReferenceStorage
@@ -24,10 +25,6 @@ type Storage struct {
// NewStorage returns a new Storage backed by a given `fs.Filesystem`
func NewStorage(fs billy.Filesystem) (*Storage, error) {
dir := dotgit.New(fs)
- if err := dir.Initialize(); err != nil {
- return nil, err
- }
-
o, err := newObjectStorage(dir)
if err != nil {
return nil, err
@@ -35,6 +32,7 @@ func NewStorage(fs billy.Filesystem) (*Storage, error) {
return &Storage{
fs: fs,
+ dir: dir,
ObjectStorage: o,
ReferenceStorage: ReferenceStorage{dir: dir},
@@ -49,3 +47,7 @@ func NewStorage(fs billy.Filesystem) (*Storage, error) {
func (s *Storage) Filesystem() billy.Filesystem {
return s.fs
}
+
+func (s *Storage) Init() error {
+ return s.dir.Initialize()
+}
diff --git a/storage/filesystem/storage_test.go b/storage/filesystem/storage_test.go
index 0127489..03d2e86 100644
--- a/storage/filesystem/storage_test.go
+++ b/storage/filesystem/storage_test.go
@@ -1,6 +1,7 @@
package filesystem
import (
+ "io/ioutil"
"testing"
"gopkg.in/src-d/go-git.v4/storage/test"
@@ -14,31 +15,29 @@ func Test(t *testing.T) { TestingT(t) }
type StorageSuite struct {
test.BaseStorageSuite
+ dir string
}
var _ = Suite(&StorageSuite{})
func (s *StorageSuite) SetUpTest(c *C) {
- storage, err := NewStorage(osfs.New(c.MkDir()))
+ s.dir = c.MkDir()
+ storage, err := NewStorage(osfs.New(s.dir))
c.Assert(err, IsNil)
s.BaseStorageSuite = test.NewBaseStorageSuite(storage)
}
-func (s *StorageSuite) TestNewStorage(c *C) {
+func (s *StorageSuite) TestFilesystem(c *C) {
fs := memfs.New()
storage, err := NewStorage(fs)
c.Assert(err, IsNil)
- c.Assert(storage, NotNil)
- _, err = fs.Stat("refs/tags")
- c.Assert(err, IsNil)
+ c.Assert(storage.Filesystem(), Equals, fs)
}
-func (s *StorageSuite) TestFilesystem(c *C) {
- fs := memfs.New()
- storage, err := NewStorage(fs)
+func (s *StorageSuite) TestNewStorageShouldNotAddAnyContentsToDir(c *C) {
+ fis, err := ioutil.ReadDir(s.dir)
c.Assert(err, IsNil)
-
- c.Assert(storage.Filesystem(), Equals, fs)
+ c.Assert(fis, HasLen, 0)
}