From 88f88ea4cf5d44065edda8b06c2267a9dccea16e Mon Sep 17 00:00:00 2001 From: "Santiago M. Mola" Date: Wed, 31 May 2017 09:02:01 +0200 Subject: storage/filesystem: call initialization explicitely, fixes #408 filesystem.Storage was initializing the gitdir (creating objects and refs) on NewStorage. But this should be done only on init and clone operations, not on open. Now there is a new interface storer.Initializer that storers can implement if they need any initialization step before init or clone. filesystem.Storage is one of such implementations. git.Init and git.Clone now call to the storer Init() method if it does implement it. Otherwise, it just ignores initialization. --- repository.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'repository.go') 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 -- cgit