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

Commit 2ff77a8

Browse files
authored
Merge pull request #398 from mcuadros/init-fix
storage: filesystem, initialize the default folder scaffolding
2 parents d98ebb5 + 8fbb991 commit 2ff77a8

File tree

5 files changed

+74
-0
lines changed

5 files changed

+74
-0
lines changed

repository.go

+8
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,14 @@ func PlainOpen(path string) (*Repository, error) {
201201
return nil, err
202202
}
203203

204+
if _, err := dot.Stat(""); err != nil {
205+
if os.IsNotExist(err) {
206+
return nil, ErrRepositoryNotExists
207+
}
208+
209+
return nil, err
210+
}
211+
204212
s, err := filesystem.NewStorage(dot)
205213
if err != nil {
206214
return nil, err

storage/filesystem/internal/dotgit/dotgit.go

+27
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,33 @@ func New(fs billy.Filesystem) *DotGit {
6666
return &DotGit{fs: fs}
6767
}
6868

69+
// Initialize creates all the folder scaffolding.
70+
func (d *DotGit) Initialize() error {
71+
mustExists := []string{
72+
d.fs.Join("objects", "info"),
73+
d.fs.Join("objects", "pack"),
74+
d.fs.Join("refs", "heads"),
75+
d.fs.Join("refs", "tags"),
76+
}
77+
78+
for _, path := range mustExists {
79+
_, err := d.fs.Stat(path)
80+
if err == nil {
81+
continue
82+
}
83+
84+
if !os.IsNotExist(err) {
85+
return err
86+
}
87+
88+
if err := d.fs.MkdirAll(path, os.ModeDir|os.ModePerm); err != nil {
89+
return err
90+
}
91+
}
92+
93+
return nil
94+
}
95+
6996
// ConfigWriter returns a file pointer for write to the config file
7097
func (d *DotGit) ConfigWriter() (billy.File, error) {
7198
return d.fs.Create(configPath)

storage/filesystem/internal/dotgit/dotgit_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,30 @@ type SuiteDotGit struct {
2323

2424
var _ = Suite(&SuiteDotGit{})
2525

26+
func (s *SuiteDotGit) TestInitialize(c *C) {
27+
tmp, err := ioutil.TempDir("", "dot-git")
28+
c.Assert(err, IsNil)
29+
defer os.RemoveAll(tmp)
30+
31+
fs := osfs.New(tmp)
32+
dir := New(fs)
33+
34+
err = dir.Initialize()
35+
c.Assert(err, IsNil)
36+
37+
_, err = fs.Stat(fs.Join("objects", "info"))
38+
c.Assert(err, IsNil)
39+
40+
_, err = fs.Stat(fs.Join("objects", "pack"))
41+
c.Assert(err, IsNil)
42+
43+
_, err = fs.Stat(fs.Join("refs", "heads"))
44+
c.Assert(err, IsNil)
45+
46+
_, err = fs.Stat(fs.Join("refs", "tags"))
47+
c.Assert(err, IsNil)
48+
}
49+
2650
func (s *SuiteDotGit) TestSetRefs(c *C) {
2751
tmp, err := ioutil.TempDir("", "dot-git")
2852
c.Assert(err, IsNil)
@@ -95,6 +119,7 @@ func (s *SuiteDotGit) TestRefsFromPackedRefs(c *C) {
95119
c.Assert(ref.Hash().String(), Equals, "e8d3ffab552895c19b9fcf7aa264d277cde33881")
96120

97121
}
122+
98123
func (s *SuiteDotGit) TestRefsFromReferenceFile(c *C) {
99124
fs := fixtures.Basic().ByTag(".git").One().DotGit()
100125
dir := New(fs)

storage/filesystem/storage.go

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ type Storage struct {
2424
// NewStorage returns a new Storage backed by a given `fs.Filesystem`
2525
func NewStorage(fs billy.Filesystem) (*Storage, error) {
2626
dir := dotgit.New(fs)
27+
if err := dir.Initialize(); err != nil {
28+
return nil, err
29+
}
30+
2731
o, err := newObjectStorage(dir)
2832
if err != nil {
2933
return nil, err

storage/filesystem/storage_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ func (s *StorageSuite) SetUpTest(c *C) {
2525
s.BaseStorageSuite = test.NewBaseStorageSuite(storage)
2626
}
2727

28+
func (s *StorageSuite) TestNewStorage(c *C) {
29+
fs := memfs.New()
30+
storage, err := NewStorage(fs)
31+
c.Assert(err, IsNil)
32+
c.Assert(storage, NotNil)
33+
34+
_, err = fs.Stat("refs/tags")
35+
c.Assert(err, IsNil)
36+
}
37+
2838
func (s *StorageSuite) TestFilesystem(c *C) {
2939
fs := memfs.New()
3040
storage, err := NewStorage(fs)

0 commit comments

Comments
 (0)