@@ -22,14 +22,18 @@ type ObjectStorage struct {
22
22
23
23
func newObjectStorage (dir * dotgit.DotGit ) (ObjectStorage , error ) {
24
24
s := ObjectStorage {
25
- dir : dir ,
26
- index : make (map [plumbing.Hash ]idx , 0 ),
25
+ dir : dir ,
27
26
}
28
27
29
- return s , s . loadIdxFiles ()
28
+ return s , nil
30
29
}
31
30
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 )
33
37
packs , err := s .dir .ObjectPacks ()
34
38
if err != nil {
35
39
return err
@@ -49,6 +53,7 @@ func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) error {
49
53
if err != nil {
50
54
return err
51
55
}
56
+ defer idxfile .Close ()
52
57
53
58
s .index [h ] = make (idx )
54
59
return s .index [h ].Decode (idxfile )
@@ -59,6 +64,10 @@ func (s *ObjectStorage) NewEncodedObject() plumbing.EncodedObject {
59
64
}
60
65
61
66
func (s * ObjectStorage ) PackfileWriter () (io.WriteCloser , error ) {
67
+ if err := s .requireIndex (); err != nil {
68
+ return nil , err
69
+ }
70
+
62
71
w , err := s .dir .NewObjectPack ()
63
72
if err != nil {
64
73
return nil , err
@@ -163,6 +172,10 @@ func (s *ObjectStorage) getFromUnpacked(h plumbing.Hash) (obj plumbing.EncodedOb
163
172
// Get returns the object with the given hash, by searching for it in
164
173
// the packfile.
165
174
func (s * ObjectStorage ) getFromPackfile (h plumbing.Hash ) (plumbing.EncodedObject , error ) {
175
+ if err := s .requireIndex (); err != nil {
176
+ return nil , err
177
+ }
178
+
166
179
pack , offset := s .findObjectInPackfile (h )
167
180
if offset == - 1 {
168
181
return nil , plumbing .ErrObjectNotFound
@@ -219,8 +232,11 @@ func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.Encode
219
232
return storer .NewMultiEncodedObjectIter (iters ), nil
220
233
}
221
234
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
+
224
240
packs , err := s .dir .ObjectPacks ()
225
241
if err != nil {
226
242
return nil , err
0 commit comments