@@ -396,7 +396,10 @@ func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.Encode
396396 return storer .NewMultiEncodedObjectIter (iters ), nil
397397}
398398
399- func (s * ObjectStorage ) buildPackfileIters (t plumbing.ObjectType , seen map [plumbing.Hash ]struct {}) (storer.EncodedObjectIter , error ) {
399+ func (s * ObjectStorage ) buildPackfileIters (
400+ t plumbing.ObjectType ,
401+ seen map [plumbing.Hash ]struct {},
402+ ) (storer.EncodedObjectIter , error ) {
400403 if err := s .requireIndex (); err != nil {
401404 return nil , err
402405 }
@@ -412,7 +415,10 @@ func (s *ObjectStorage) buildPackfileIters(t plumbing.ObjectType, seen map[plumb
412415 if err != nil {
413416 return nil , err
414417 }
415- return newPackfileIter (s .dir .Fs (), pack , t , seen , s .index [h ], s .deltaBaseCache )
418+ return newPackfileIter (
419+ s .dir .Fs (), pack , t , seen , s .index [h ],
420+ s .deltaBaseCache , s .options .KeepDescriptors ,
421+ )
416422 },
417423 }, nil
418424}
@@ -470,9 +476,10 @@ func (it *lazyPackfilesIter) Close() {
470476}
471477
472478type packfileIter struct {
473- pack billy.File
474- iter storer.EncodedObjectIter
475- seen map [plumbing.Hash ]struct {}
479+ pack billy.File
480+ iter storer.EncodedObjectIter
481+ seen map [plumbing.Hash ]struct {}
482+ keepPack bool
476483}
477484
478485// NewPackfileIter returns a new EncodedObjectIter for the provided packfile
@@ -483,6 +490,7 @@ func NewPackfileIter(
483490 f billy.File ,
484491 idxFile billy.File ,
485492 t plumbing.ObjectType ,
493+ keepPack bool ,
486494) (storer.EncodedObjectIter , error ) {
487495 idx := idxfile .NewMemoryIndex ()
488496 if err := idxfile .NewDecoder (idxFile ).Decode (idx ); err != nil {
@@ -493,7 +501,8 @@ func NewPackfileIter(
493501 return nil , err
494502 }
495503
496- return newPackfileIter (fs , f , t , make (map [plumbing.Hash ]struct {}), idx , nil )
504+ seen := make (map [plumbing.Hash ]struct {})
505+ return newPackfileIter (fs , f , t , seen , idx , nil , keepPack )
497506}
498507
499508func newPackfileIter (
@@ -503,6 +512,7 @@ func newPackfileIter(
503512 seen map [plumbing.Hash ]struct {},
504513 index idxfile.Index ,
505514 cache cache.Object ,
515+ keepPack bool ,
506516) (storer.EncodedObjectIter , error ) {
507517 var p * packfile.Packfile
508518 if cache != nil {
@@ -517,9 +527,10 @@ func newPackfileIter(
517527 }
518528
519529 return & packfileIter {
520- pack : f ,
521- iter : iter ,
522- seen : seen ,
530+ pack : f ,
531+ iter : iter ,
532+ seen : seen ,
533+ keepPack : keepPack ,
523534 }, nil
524535}
525536
@@ -557,7 +568,9 @@ func (iter *packfileIter) ForEach(cb func(plumbing.EncodedObject) error) error {
557568
558569func (iter * packfileIter ) Close () {
559570 iter .iter .Close ()
560- _ = iter .pack .Close ()
571+ if ! iter .keepPack {
572+ _ = iter .pack .Close ()
573+ }
561574}
562575
563576type objectsIter struct {
0 commit comments