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

Commit a9fbf5b

Browse files
committed
utils: binary reader, add ReadUntilFromBufioReader()
Signed-off-by: Arran Walker <arran.walker@fiveturns.org>
1 parent 5598068 commit a9fbf5b

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

plumbing/format/index/decoder.go

Lines changed: 5 additions & 5 deletions
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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
5353
}
5454
}
5555

56+
// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter
57+
// from the result.
58+
func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) {
59+
value, err := r.ReadBytes(delim)
60+
if err != nil || len(value) == 0 {
61+
return nil, err
62+
}
63+
64+
return value[:len(value)-1], nil
65+
}
66+
5667
// ReadVariableWidthInt reads and returns an int in Git VLQ special format:
5768
//
5869
// Ordinary VLQ has some redundancies, example: the number 358 can be

utils/binary/read_test.go

Lines changed: 10 additions & 0 deletions
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)