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 {
@@ -351,14 +354,14 @@ func (d *treeExtensionDecoder) Decode(t *Tree) error {
351
354
func (d * treeExtensionDecoder ) readEntry () (* TreeEntry , error ) {
352
355
e := & TreeEntry {}
353
356
354
- path , err := binary . ReadUntil ( d .r , '\x00' )
357
+ path , err := d .r . ReadSlice ( '\x00' )
355
358
if err != nil {
356
359
return nil , err
357
360
}
358
361
359
362
e .Path = string (path )
360
363
361
- count , err := binary . ReadUntil ( d .r , ' ' )
364
+ count , err := d .r . ReadSlice ( ' ' )
362
365
if err != nil {
363
366
return nil , err
364
367
}
@@ -375,7 +378,7 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
375
378
}
376
379
377
380
e .Entries = i
378
- trees , err := binary . ReadUntil ( d .r , '\n' )
381
+ trees , err := d .r . ReadSlice ( '\n' )
379
382
if err != nil {
380
383
return nil , err
381
384
}
@@ -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 {
@@ -418,7 +418,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
418
418
Stages : make (map [Stage ]plumbing.Hash ),
419
419
}
420
420
421
- path , err := binary . ReadUntil ( d .r , '\x00' )
421
+ path , err := d .r . ReadSlice ( '\x00' )
422
422
if err != nil {
423
423
return nil , err
424
424
}
@@ -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
@@ -444,7 +444,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
444
444
}
445
445
446
446
func (d * resolveUndoDecoder ) readStage (e * ResolveUndoEntry , s Stage ) error {
447
- ascii , err := binary . ReadUntil ( d .r , '\x00' )
447
+ ascii , err := d .r . ReadSlice ( '\x00' )
448
448
if err != nil {
449
449
return err
450
450
}
@@ -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