Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 7dcc710

Browse files
committed
utils: binary reader, add ReadUntilFromBufioReader()
Signed-off-by: Arran Walker <[email protected]>
1 parent 5598068 commit 7dcc710

File tree

3 files changed

+26
-14
lines changed

3 files changed

+26
-14
lines changed

plumbing/format/index/decoder.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -354,14 +354,14 @@ func (d *treeExtensionDecoder) Decode(t *Tree) error {
354354
func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
355355
e := &TreeEntry{}
356356

357-
path, err := binary.ReadUntil(d.r, '\x00')
357+
path, err := binary.ReadUntilFromBufioReader(d.r, '\x00')
358358
if err != nil {
359359
return nil, err
360360
}
361361

362362
e.Path = string(path)
363363

364-
count, err := binary.ReadUntil(d.r, ' ')
364+
count, err := binary.ReadUntilFromBufioReader(d.r, ' ')
365365
if err != nil {
366366
return nil, err
367367
}
@@ -378,7 +378,7 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
378378
}
379379

380380
e.Entries = i
381-
trees, err := binary.ReadUntil(d.r, '\n')
381+
trees, err := binary.ReadUntilFromBufioReader(d.r, '\n')
382382
if err != nil {
383383
return nil, err
384384
}
@@ -418,7 +418,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
418418
Stages: make(map[Stage]plumbing.Hash),
419419
}
420420

421-
path, err := binary.ReadUntil(d.r, '\x00')
421+
path, err := binary.ReadUntilFromBufioReader(d.r, '\x00')
422422
if err != nil {
423423
return nil, err
424424
}
@@ -444,7 +444,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
444444
}
445445

446446
func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
447-
ascii, err := binary.ReadUntil(d.r, '\x00')
447+
ascii, err := binary.ReadUntilFromBufioReader(d.r, '\x00')
448448
if err != nil {
449449
return err
450450
}

utils/binary/read.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,6 @@ func Read(r io.Reader, data ...interface{}) error {
2525

2626
// ReadUntil reads from r untin delim is found
2727
func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
28-
if bufr, ok := r.(*bufio.Reader); ok {
29-
value, err := bufr.ReadBytes(delim)
30-
if err != nil || len(value) == 0 {
31-
return nil, err
32-
}
33-
34-
return value[:len(value)-1], nil
35-
}
36-
3728
var buf [1]byte
3829
value := make([]byte, 0, 16)
3930
for {
@@ -53,6 +44,17 @@ func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
5344
}
5445
}
5546

47+
// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter
48+
// from the result.
49+
func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) {
50+
value, err := r.ReadBytes(delim)
51+
if err != nil || len(value) == 0 {
52+
return nil, err
53+
}
54+
55+
return value[:len(value)-1], nil
56+
}
57+
5658
// ReadVariableWidthInt reads and returns an int in Git VLQ special format:
5759
//
5860
// Ordinary VLQ has some redundancies, example: the number 358 can be

utils/binary/read_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package binary
22

33
import (
4+
"bufio"
45
"bytes"
56
"encoding/binary"
67
"testing"
@@ -39,6 +40,15 @@ func (s *BinarySuite) TestReadUntil(c *C) {
3940
c.Assert(string(b), Equals, "foo")
4041
}
4142

43+
func (s *BinarySuite) TestReadUntilFromBufioReader(c *C) {
44+
buf := bufio.NewReader(bytes.NewBuffer([]byte("foo bar")))
45+
46+
b, err := ReadUntilFromBufioReader(buf, ' ')
47+
c.Assert(err, IsNil)
48+
c.Assert(b, HasLen, 3)
49+
c.Assert(string(b), Equals, "foo")
50+
}
51+
4252
func (s *BinarySuite) TestReadVariableWidthInt(c *C) {
4353
buf := bytes.NewBuffer([]byte{129, 110})
4454

0 commit comments

Comments
 (0)