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

Commit 48dec88

Browse files
authored
Merge pull request #333 from taralx/master
Lazily load object index.
2 parents c34356d + 6ed3f8c commit 48dec88

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

storage/filesystem/object.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@ type ObjectStorage struct {
2222

2323
func newObjectStorage(dir *dotgit.DotGit) (ObjectStorage, error) {
2424
s := ObjectStorage{
25-
dir: dir,
26-
index: make(map[plumbing.Hash]idx, 0),
25+
dir: dir,
2726
}
2827

29-
return s, s.loadIdxFiles()
28+
return s, nil
3029
}
3130

32-
func (s *ObjectStorage) loadIdxFiles() error {
31+
func (s *ObjectStorage) requireIndex() error {
32+
if s.index != nil {
33+
return nil
34+
}
35+
36+
s.index = make(map[plumbing.Hash]idx, 0)
3337
packs, err := s.dir.ObjectPacks()
3438
if err != nil {
3539
return err
@@ -49,6 +53,7 @@ func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) error {
4953
if err != nil {
5054
return err
5155
}
56+
defer idxfile.Close()
5257

5358
s.index[h] = make(idx)
5459
return s.index[h].Decode(idxfile)
@@ -59,6 +64,10 @@ func (s *ObjectStorage) NewEncodedObject() plumbing.EncodedObject {
5964
}
6065

6166
func (s *ObjectStorage) PackfileWriter() (io.WriteCloser, error) {
67+
if err := s.requireIndex(); err != nil {
68+
return nil, err
69+
}
70+
6271
w, err := s.dir.NewObjectPack()
6372
if err != nil {
6473
return nil, err
@@ -163,6 +172,10 @@ func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedOb
163172
// Get returns the object with the given hash, by searching for it in
164173
// the packfile.
165174
func (s *ObjectStorage) getFromPackfile(h plumbing.Hash) (plumbing.EncodedObject, error) {
175+
if err := s.requireIndex(); err != nil {
176+
return nil, err
177+
}
178+
166179
pack, offset := s.findObjectInPackfile(h)
167180
if offset == -1 {
168181
return nil, plumbing.ErrObjectNotFound
@@ -219,8 +232,11 @@ func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.Encode
219232
return storer.NewMultiEncodedObjectIter(iters), nil
220233
}
221234

222-
func (s *ObjectStorage) buildPackfileIters(
223-
t plumbing.ObjectType, seen map[plumbing.Hash]bool) ([]storer.EncodedObjectIter, error) {
235+
func (s *ObjectStorage) buildPackfileIters(t plumbing.ObjectType, seen map[plumbing.Hash]bool) ([]storer.EncodedObjectIter, error) {
236+
if err := s.requireIndex(); err != nil {
237+
return nil, err
238+
}
239+
224240
packs, err := s.dir.ObjectPacks()
225241
if err != nil {
226242
return nil, err

0 commit comments

Comments
 (0)