Skip to content

Commit 91658e7

Browse files
committed
Fix object not found error in OFS deltas
Unfortunately the code in go-git#303 was incorrect for large objects in OFS deltas. The underlying fault is that the seeker in the packfile was seeking away whilst the delta was being read. This PR simply reads the delta into a buffer. Fix go-git#323 Signed-off-by: Andrew Thornton <[email protected]>
1 parent db4233e commit 91658e7

File tree

2 files changed

+13
-17
lines changed

2 files changed

+13
-17
lines changed

plumbing/format/packfile/packfile.go

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -293,24 +293,28 @@ func (p *Packfile) getReaderDirect(h *ObjectHeader) (io.ReadCloser, error) {
293293
case plumbing.CommitObject, plumbing.TreeObject, plumbing.BlobObject, plumbing.TagObject:
294294
return p.s.ReadObject()
295295
case plumbing.REFDeltaObject:
296-
deltaRC, err := p.s.ReadObject()
296+
deltaBuf := bufPool.Get().(*bytes.Buffer)
297+
defer bufPool.Put(deltaBuf)
298+
deltaBuf.Reset()
299+
_, _, err := p.s.NextObject(deltaBuf)
297300
if err != nil {
298301
return nil, err
299302
}
300-
r, err := p.readREFDeltaObjectContent(h, deltaRC)
303+
r, err := p.readREFDeltaObjectContent(h, deltaBuf)
301304
if err != nil {
302-
_ = deltaRC.Close()
303305
return nil, err
304306
}
305307
return r, nil
306308
case plumbing.OFSDeltaObject:
307-
deltaRC, err := p.s.ReadObject()
309+
deltaBuf := bufPool.Get().(*bytes.Buffer)
310+
defer bufPool.Put(deltaBuf)
311+
deltaBuf.Reset()
312+
_, _, err := p.s.NextObject(deltaBuf)
308313
if err != nil {
309314
return nil, err
310315
}
311-
r, err := p.readOFSDeltaObjectContent(h, deltaRC)
316+
r, err := p.readOFSDeltaObjectContent(h, deltaBuf)
312317
if err != nil {
313-
_ = deltaRC.Close()
314318
return nil, err
315319
}
316320
return r, nil
@@ -371,7 +375,7 @@ func (p *Packfile) fillREFDeltaObjectContent(obj plumbing.EncodedObject, ref plu
371375
return p.fillREFDeltaObjectContentWithBuffer(obj, ref, buf)
372376
}
373377

374-
func (p *Packfile) readREFDeltaObjectContent(h *ObjectHeader, deltaRC io.ReadCloser) (io.ReadCloser, error) {
378+
func (p *Packfile) readREFDeltaObjectContent(h *ObjectHeader, deltaRC io.Reader) (io.ReadCloser, error) {
375379
var err error
376380

377381
base, ok := p.cacheGet(h.Reference)
@@ -415,7 +419,7 @@ func (p *Packfile) fillOFSDeltaObjectContent(obj plumbing.EncodedObject, offset
415419
return p.fillOFSDeltaObjectContentWithBuffer(obj, offset, buf)
416420
}
417421

418-
func (p *Packfile) readOFSDeltaObjectContent(h *ObjectHeader, deltaRC io.ReadCloser) (io.ReadCloser, error) {
422+
func (p *Packfile) readOFSDeltaObjectContent(h *ObjectHeader, deltaRC io.Reader) (io.ReadCloser, error) {
419423
hash, err := p.FindHash(h.OffsetReference)
420424
if err != nil {
421425
return nil, err
@@ -426,14 +430,6 @@ func (p *Packfile) readOFSDeltaObjectContent(h *ObjectHeader, deltaRC io.ReadClo
426430
return nil, err
427431
}
428432

429-
base, ok := p.cacheGet(h.Reference)
430-
if !ok {
431-
base, err = p.Get(h.Reference)
432-
if err != nil {
433-
return nil, err
434-
}
435-
}
436-
437433
return ReaderFromDelta(h, base, deltaRC)
438434
}
439435

plumbing/format/packfile/patch_delta.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func PatchDelta(src, delta []byte) ([]byte, error) {
7575
return b.Bytes(), nil
7676
}
7777

78-
func ReaderFromDelta(h *ObjectHeader, base plumbing.EncodedObject, deltaRC io.ReadCloser) (io.ReadCloser, error) {
78+
func ReaderFromDelta(h *ObjectHeader, base plumbing.EncodedObject, deltaRC io.Reader) (io.ReadCloser, error) {
7979
deltaBuf := bufio.NewReaderSize(deltaRC, 1024)
8080
srcSz, err := decodeLEB128ByteReader(deltaBuf)
8181
if err != nil {

0 commit comments

Comments
 (0)