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

Commit

Permalink
utils: binary reader, add ReadUntilFromBufioReader()
Browse files Browse the repository at this point in the history
Signed-off-by: Arran Walker <arran.walker@fiveturns.org>
  • Loading branch information
saracen committed Apr 22, 2019
1 parent 5598068 commit 7dcc710
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 14 deletions.
10 changes: 5 additions & 5 deletions plumbing/format/index/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,14 @@ func (d *treeExtensionDecoder) Decode(t *Tree) error {
func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
e := &TreeEntry{}

path, err := binary.ReadUntil(d.r, '\x00')
path, err := binary.ReadUntilFromBufioReader(d.r, '\x00')
if err != nil {
return nil, err
}

e.Path = string(path)

count, err := binary.ReadUntil(d.r, ' ')
count, err := binary.ReadUntilFromBufioReader(d.r, ' ')
if err != nil {
return nil, err
}
Expand All @@ -378,7 +378,7 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
}

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

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

func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
ascii, err := binary.ReadUntil(d.r, '\x00')
ascii, err := binary.ReadUntilFromBufioReader(d.r, '\x00')
if err != nil {
return err
}
Expand Down
20 changes: 11 additions & 9 deletions utils/binary/read.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,6 @@ func Read(r io.Reader, data ...interface{}) error {

// ReadUntil reads from r untin delim is found
func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
if bufr, ok := r.(*bufio.Reader); ok {
value, err := bufr.ReadBytes(delim)
if err != nil || len(value) == 0 {
return nil, err
}

return value[:len(value)-1], nil
}

var buf [1]byte
value := make([]byte, 0, 16)
for {
Expand All @@ -53,6 +44,17 @@ func ReadUntil(r io.Reader, delim byte) ([]byte, error) {
}
}

// ReadUntilFromBufioReader is like bufio.ReadBytes but drops the delimiter
// from the result.
func ReadUntilFromBufioReader(r *bufio.Reader, delim byte) ([]byte, error) {
value, err := r.ReadBytes(delim)
if err != nil || len(value) == 0 {
return nil, err
}

return value[:len(value)-1], nil
}

// ReadVariableWidthInt reads and returns an int in Git VLQ special format:
//
// Ordinary VLQ has some redundancies, example: the number 358 can be
Expand Down
10 changes: 10 additions & 0 deletions utils/binary/read_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package binary

import (
"bufio"
"bytes"
"encoding/binary"
"testing"
Expand Down Expand Up @@ -39,6 +40,15 @@ func (s *BinarySuite) TestReadUntil(c *C) {
c.Assert(string(b), Equals, "foo")
}

func (s *BinarySuite) TestReadUntilFromBufioReader(c *C) {
buf := bufio.NewReader(bytes.NewBuffer([]byte("foo bar")))

b, err := ReadUntilFromBufioReader(buf, ' ')
c.Assert(err, IsNil)
c.Assert(b, HasLen, 3)
c.Assert(string(b), Equals, "foo")
}

func (s *BinarySuite) TestReadVariableWidthInt(c *C) {
buf := bytes.NewBuffer([]byte{129, 110})

Expand Down

0 comments on commit 7dcc710

Please sign in to comment.