@@ -396,7 +396,10 @@ func (s *ObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (storer.Encode
396
396
return storer .NewMultiEncodedObjectIter (iters ), nil
397
397
}
398
398
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 ) {
400
403
if err := s .requireIndex (); err != nil {
401
404
return nil , err
402
405
}
@@ -412,7 +415,10 @@ func (s *ObjectStorage) buildPackfileIters(t plumbing.ObjectType, seen map[plumb
412
415
if err != nil {
413
416
return nil , err
414
417
}
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
+ )
416
422
},
417
423
}, nil
418
424
}
@@ -473,16 +479,21 @@ type packfileIter struct {
473
479
pack billy.File
474
480
iter storer.EncodedObjectIter
475
481
seen map [plumbing.Hash ]struct {}
482
+
483
+ // tells whether the pack file should be left open after iteration or not
484
+ keepPack bool
476
485
}
477
486
478
487
// NewPackfileIter returns a new EncodedObjectIter for the provided packfile
479
488
// and object type. Packfile and index file will be closed after they're
480
- // used.
489
+ // used. If keepPack is true the packfile won't be closed after the iteration
490
+ // finished.
481
491
func NewPackfileIter (
482
492
fs billy.Filesystem ,
483
493
f billy.File ,
484
494
idxFile billy.File ,
485
495
t plumbing.ObjectType ,
496
+ keepPack bool ,
486
497
) (storer.EncodedObjectIter , error ) {
487
498
idx := idxfile .NewMemoryIndex ()
488
499
if err := idxfile .NewDecoder (idxFile ).Decode (idx ); err != nil {
@@ -493,7 +504,8 @@ func NewPackfileIter(
493
504
return nil , err
494
505
}
495
506
496
- return newPackfileIter (fs , f , t , make (map [plumbing.Hash ]struct {}), idx , nil )
507
+ seen := make (map [plumbing.Hash ]struct {})
508
+ return newPackfileIter (fs , f , t , seen , idx , nil , keepPack )
497
509
}
498
510
499
511
func newPackfileIter (
@@ -503,6 +515,7 @@ func newPackfileIter(
503
515
seen map [plumbing.Hash ]struct {},
504
516
index idxfile.Index ,
505
517
cache cache.Object ,
518
+ keepPack bool ,
506
519
) (storer.EncodedObjectIter , error ) {
507
520
var p * packfile.Packfile
508
521
if cache != nil {
@@ -517,9 +530,10 @@ func newPackfileIter(
517
530
}
518
531
519
532
return & packfileIter {
520
- pack : f ,
521
- iter : iter ,
522
- seen : seen ,
533
+ pack : f ,
534
+ iter : iter ,
535
+ seen : seen ,
536
+ keepPack : keepPack ,
523
537
}, nil
524
538
}
525
539
@@ -557,7 +571,9 @@ func (iter *packfileIter) ForEach(cb func(plumbing.EncodedObject) error) error {
557
571
558
572
func (iter * packfileIter ) Close () {
559
573
iter .iter .Close ()
560
- _ = iter .pack .Close ()
574
+ if ! iter .keepPack {
575
+ _ = iter .pack .Close ()
576
+ }
561
577
}
562
578
563
579
type objectsIter struct {
0 commit comments