@@ -222,10 +222,16 @@ func (dw *deltaSelector) walk(
222222) error {
223223 indexMap := make (map [plumbing.Hash ]* deltaIndex )
224224 for i := 0 ; i < len (objectsToPack ); i ++ {
225- // Clean up the index map for anything outside our pack
226- // window, to save memory.
225+ // Clean up the index map and reconstructed delta objects for anything
226+ // outside our pack window, to save memory.
227227 if i > int (packWindow ) {
228- delete (indexMap , objectsToPack [i - int (packWindow )].Hash ())
228+ obj := objectsToPack [i - int (packWindow )]
229+
230+ delete (indexMap , obj .Hash ())
231+
232+ if obj .IsDelta () {
233+ obj .Original = nil
234+ }
229235 }
230236
231237 target := objectsToPack [i ]
@@ -261,6 +267,16 @@ func (dw *deltaSelector) walk(
261267}
262268
263269func (dw * deltaSelector ) tryToDeltify (indexMap map [plumbing.Hash ]* deltaIndex , base , target * ObjectToPack ) error {
270+ // Original object might not be present if we're reusing a delta, so we
271+ // ensure it is restored.
272+ if err := dw .restoreOriginal (target ); err != nil {
273+ return err
274+ }
275+
276+ if err := dw .restoreOriginal (base ); err != nil {
277+ return err
278+ }
279+
264280 // If the sizes are radically different, this is a bad pairing.
265281 if target .Size () < base .Size ()>> 4 {
266282 return nil
@@ -283,16 +299,6 @@ func (dw *deltaSelector) tryToDeltify(indexMap map[plumbing.Hash]*deltaIndex, ba
283299 return nil
284300 }
285301
286- // Original object might not be present if we're reusing a delta, so we
287- // ensure it is restored.
288- if err := dw .restoreOriginal (target ); err != nil {
289- return err
290- }
291-
292- if err := dw .restoreOriginal (base ); err != nil {
293- return err
294- }
295-
296302 if _ , ok := indexMap [base .Hash ()]; ! ok {
297303 indexMap [base .Hash ()] = new (deltaIndex )
298304 }
0 commit comments