11package index
22
33import (
4+ "bufio"
45 "bytes"
56 "crypto/sha1"
67 "errors"
@@ -42,14 +43,17 @@ type Decoder struct {
4243 r io.Reader
4344 hash hash.Hash
4445 lastEntry * Entry
46+
47+ extReader * bufio.Reader
4548}
4649
4750// NewDecoder returns a new decoder that reads from r.
4851func NewDecoder (r io.Reader ) * Decoder {
4952 h := sha1 .New ()
5053 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 ),
5357 }
5458}
5559
@@ -184,11 +188,9 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
184188
185189func (d * Decoder ) doReadEntryName (len uint16 ) (string , error ) {
186190 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 [:])
190192
191- return string (name ), nil
193+ return string (name ), err
192194}
193195
194196// Index entries are padded out to the next 8 byte alignment
@@ -279,20 +281,21 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
279281 return nil
280282}
281283
282- func (d * Decoder ) getExtensionReader () (io .Reader , error ) {
284+ func (d * Decoder ) getExtensionReader () (* bufio .Reader , error ) {
283285 len , err := binary .ReadUint32 (d .r )
284286 if err != nil {
285287 return nil , err
286288 }
287289
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
289292}
290293
291294func (d * Decoder ) readChecksum (expected []byte , alreadyRead [4 ]byte ) error {
292295 var h plumbing.Hash
293296 copy (h [:4 ], alreadyRead [:])
294297
295- if err := binary . Read (d .r , h [4 :]); err != nil {
298+ if _ , err := io . ReadFull (d .r , h [4 :]); err != nil {
296299 return err
297300 }
298301
@@ -326,7 +329,7 @@ func validateHeader(r io.Reader) (version uint32, err error) {
326329}
327330
328331type treeExtensionDecoder struct {
329- r io .Reader
332+ r * bufio .Reader
330333}
331334
332335func (d * treeExtensionDecoder ) Decode (t * Tree ) error {
@@ -386,16 +389,13 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
386389 }
387390
388391 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 [:])
393393
394394 return e , nil
395395}
396396
397397type resolveUndoDecoder struct {
398- r io .Reader
398+ r * bufio .Reader
399399}
400400
401401func (d * resolveUndoDecoder ) Decode (ru * ResolveUndo ) error {
@@ -433,7 +433,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
433433
434434 for s := range e .Stages {
435435 var hash plumbing.Hash
436- if err := binary . Read (d .r , hash [:]); err != nil {
436+ if _ , err := io . ReadFull (d .r , hash [:]); err != nil {
437437 return nil , err
438438 }
439439
@@ -462,7 +462,7 @@ func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
462462}
463463
464464type endOfIndexEntryDecoder struct {
465- r io .Reader
465+ r * bufio .Reader
466466}
467467
468468func (d * endOfIndexEntryDecoder ) Decode (e * EndOfIndexEntry ) error {
@@ -472,5 +472,6 @@ func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error {
472472 return err
473473 }
474474
475- return binary .Read (d .r , & e .Hash )
475+ _ , err = io .ReadFull (d .r , e .Hash [:])
476+ return err
476477}
0 commit comments