5252// is destroyed. The Offsets and CRCs are calculated whether an
5353// ObjectStorer was provided or not.
5454type Decoder struct {
55+ DeltaBaseCache cache.Object
56+
5557 s * Scanner
5658 o storer.EncodedObjectStorer
5759 tx storer.Transaction
@@ -65,8 +67,6 @@ type Decoder struct {
6567
6668 offsetToType map [int64 ]plumbing.ObjectType
6769 decoderType plumbing.ObjectType
68-
69- cache cache.Object
7070}
7171
7272// NewDecoder returns a new Decoder that decodes a Packfile using the given
@@ -107,8 +107,6 @@ func NewDecoderForType(s *Scanner, o storer.EncodedObjectStorer,
107107 idx : NewIndex (0 ),
108108 offsetToType : make (map [int64 ]plumbing.ObjectType , 0 ),
109109 decoderType : t ,
110-
111- cache : cache .NewObjectFIFO (cache .MaxSize ),
112110 }, nil
113111}
114112
@@ -355,7 +353,7 @@ func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plum
355353 return 0 , err
356354 }
357355
358- base , ok := d .cache . Get (ref )
356+ base , ok := d .cacheGet (ref )
359357 if ! ok {
360358 base , err = d .recallByHash (ref )
361359 if err != nil {
@@ -365,7 +363,7 @@ func (d *Decoder) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plum
365363
366364 obj .SetType (base .Type ())
367365 err = ApplyDelta (obj , base , buf .Bytes ())
368- d .cache . Put (obj )
366+ d .cachePut (obj )
369367
370368 return crc , err
371369}
@@ -380,7 +378,7 @@ func (d *Decoder) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset i
380378 e , ok := d .idx .LookupOffset (uint64 (offset ))
381379 var base plumbing.EncodedObject
382380 if ok {
383- base , ok = d .cache . Get (e .Hash )
381+ base , ok = d .cacheGet (e .Hash )
384382 }
385383
386384 if ! ok {
@@ -392,11 +390,27 @@ func (d *Decoder) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset i
392390
393391 obj .SetType (base .Type ())
394392 err = ApplyDelta (obj , base , buf .Bytes ())
395- d .cache . Put (obj )
393+ d .cachePut (obj )
396394
397395 return crc , err
398396}
399397
398+ func (d * Decoder ) cacheGet (h plumbing.Hash ) (plumbing.EncodedObject , bool ) {
399+ if d .DeltaBaseCache == nil {
400+ return nil , false
401+ }
402+
403+ return d .DeltaBaseCache .Get (h )
404+ }
405+
406+ func (d * Decoder ) cachePut (obj plumbing.EncodedObject ) {
407+ if d .DeltaBaseCache == nil {
408+ return
409+ }
410+
411+ d .DeltaBaseCache .Put (obj )
412+ }
413+
400414func (d * Decoder ) recallByOffset (o int64 ) (plumbing.EncodedObject , error ) {
401415 if d .s .IsSeekable {
402416 return d .DecodeObjectAt (o )
@@ -454,7 +468,5 @@ func (d *Decoder) Index() *Index {
454468// Close closes the Scanner. usually this mean that the whole reader is read and
455469// discarded
456470func (d * Decoder ) Close () error {
457- d .cache .Clear ()
458-
459471 return d .s .Close ()
460472}
0 commit comments