1
1
package index
2
2
3
3
import (
4
+ "bufio"
4
5
"bytes"
5
6
"crypto/sha1"
6
7
"errors"
@@ -42,14 +43,17 @@ type Decoder struct {
42
43
r io.Reader
43
44
hash hash.Hash
44
45
lastEntry * Entry
46
+
47
+ extReader * bufio.Reader
45
48
}
46
49
47
50
// NewDecoder returns a new decoder that reads from r.
48
51
func NewDecoder (r io.Reader ) * Decoder {
49
52
h := sha1 .New ()
50
53
return & Decoder {
51
- r : io .TeeReader (r , h ),
52
- hash : h ,
54
+ r : io .TeeReader (r , h ),
55
+ hash : h ,
56
+ extReader : bufio .NewReader (nil ),
53
57
}
54
58
}
55
59
@@ -184,11 +188,9 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
184
188
185
189
func (d * Decoder ) doReadEntryName (len uint16 ) (string , error ) {
186
190
name := make ([]byte , len )
187
- if err := binary .Read (d .r , & name ); err != nil {
188
- return "" , err
189
- }
191
+ _ , err := io .ReadFull (d .r , name [:])
190
192
191
- return string (name ), nil
193
+ return string (name ), err
192
194
}
193
195
194
196
// Index entries are padded out to the next 8 byte alignment
@@ -279,20 +281,21 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
279
281
return nil
280
282
}
281
283
282
- func (d * Decoder ) getExtensionReader () (io .Reader , error ) {
284
+ func (d * Decoder ) getExtensionReader () (* bufio .Reader , error ) {
283
285
len , err := binary .ReadUint32 (d .r )
284
286
if err != nil {
285
287
return nil , err
286
288
}
287
289
288
- return & io.LimitedReader {R : d .r , N : int64 (len )}, nil
290
+ d .extReader .Reset (& io.LimitedReader {R : d .r , N : int64 (len )})
291
+ return d .extReader , nil
289
292
}
290
293
291
294
func (d * Decoder ) readChecksum (expected []byte , alreadyRead [4 ]byte ) error {
292
295
var h plumbing.Hash
293
296
copy (h [:4 ], alreadyRead [:])
294
297
295
- if err := binary . Read (d .r , h [4 :]); err != nil {
298
+ if _ , err := io . ReadFull (d .r , h [4 :]); err != nil {
296
299
return err
297
300
}
298
301
@@ -326,7 +329,7 @@ func validateHeader(r io.Reader) (version uint32, err error) {
326
329
}
327
330
328
331
type treeExtensionDecoder struct {
329
- r io .Reader
332
+ r * bufio .Reader
330
333
}
331
334
332
335
func (d * treeExtensionDecoder ) Decode (t * Tree ) error {
@@ -386,16 +389,13 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
386
389
}
387
390
388
391
e .Trees = i
389
-
390
- if err := binary .Read (d .r , & e .Hash ); err != nil {
391
- return nil , err
392
- }
392
+ _ , err = io .ReadFull (d .r , e .Hash [:])
393
393
394
394
return e , nil
395
395
}
396
396
397
397
type resolveUndoDecoder struct {
398
- r io .Reader
398
+ r * bufio .Reader
399
399
}
400
400
401
401
func (d * resolveUndoDecoder ) Decode (ru * ResolveUndo ) error {
@@ -433,7 +433,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
433
433
434
434
for s := range e .Stages {
435
435
var hash plumbing.Hash
436
- if err := binary . Read (d .r , hash [:]); err != nil {
436
+ if _ , err := io . ReadFull (d .r , hash [:]); err != nil {
437
437
return nil , err
438
438
}
439
439
@@ -462,7 +462,7 @@ func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
462
462
}
463
463
464
464
type endOfIndexEntryDecoder struct {
465
- r io .Reader
465
+ r * bufio .Reader
466
466
}
467
467
468
468
func (d * endOfIndexEntryDecoder ) Decode (e * EndOfIndexEntry ) error {
@@ -472,5 +472,6 @@ func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error {
472
472
return err
473
473
}
474
474
475
- return binary .Read (d .r , & e .Hash )
475
+ _ , err = io .ReadFull (d .r , e .Hash [:])
476
+ return err
476
477
}
0 commit comments