Skip to content

Commit 07d9929

Browse files
committed
refactor into readLine helper
1 parent c12bc15 commit 07d9929

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

diff/parse.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) {
6868
// caused by the lack of any hunks, or a malformatted hunk, so we
6969
// need to perform the check here.
7070
hr := fr.HunksReader()
71-
line, err := r.reader.ReadBytes('\n')
72-
if err != nil && !(err == io.EOF && len(line) > 0) {
71+
line, err := readLine(r.reader)
72+
if err != nil {
7373
return d, err
7474
}
7575
line = bytes.TrimSuffix(line, []byte{'\n'})
@@ -216,15 +216,12 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
216216

217217
if r.fileHeaderLine == nil {
218218
var err error
219-
line, err = r.reader.ReadBytes('\n')
219+
line, err = readLine(r.reader)
220220
if err == io.EOF {
221-
if len(line) == 0 {
222-
return "", nil, &ParseError{r.line, r.offset, ErrNoFileHeader}
223-
}
221+
return "", nil, &ParseError{r.line, r.offset, ErrNoFileHeader}
224222
} else if err != nil {
225223
return "", nil, err
226224
}
227-
line = bytes.TrimSuffix(line, []byte{'\n'})
228225
} else {
229226
line = r.fileHeaderLine
230227
r.fileHeaderLine = nil
@@ -263,15 +260,12 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
263260
var line []byte
264261
if r.fileHeaderLine == nil {
265262
var err error
266-
line, err = r.reader.ReadBytes('\n')
263+
line, err = readLine(r.reader)
267264
if err == io.EOF {
268-
if len(line) == 0 {
269-
return xheaders, &ParseError{r.line, r.offset, ErrExtendedHeadersEOF}
270-
}
265+
return xheaders, &ParseError{r.line, r.offset, ErrExtendedHeadersEOF}
271266
} else if err != nil {
272267
return xheaders, err
273268
}
274-
line = bytes.TrimSuffix(line, []byte{'\n'})
275269
} else {
276270
line = r.fileHeaderLine
277271
r.fileHeaderLine = nil
@@ -344,14 +338,13 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) {
344338
line = r.nextHunkHeaderLine
345339
r.nextHunkHeaderLine = nil
346340
} else {
347-
line, err = r.reader.ReadBytes('\n')
341+
line, err = readLine(r.reader)
348342
if err != nil {
349343
if err == io.EOF && r.hunk != nil {
350344
return r.hunk, nil
351345
}
352346
return nil, err
353347
}
354-
line = bytes.TrimSuffix(line, []byte{'\n'})
355348
}
356349

357350
// Record position.

diff/reader_util.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package diff
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"io"
7+
)
8+
9+
// readLine is a helper that mimics the functionality of calling bufio.Scanner.Scan() and
10+
// bufio.Scanner.Bytes(), but without the token size limitation. It will read and return
11+
// the next line in the Reader with the trailing newline stripped. It will return an
12+
// io.EOF error when there is nothing left to read (at the start of the function call). It
13+
// will return any other errors it receives from the underlying call to ReadBytes.
14+
func readLine(r *bufio.Reader) ([]byte, error) {
15+
line_, err := r.ReadBytes('\n')
16+
if err == io.EOF {
17+
if len(line_) == 0 {
18+
return nil, io.EOF
19+
}
20+
21+
// ReadBytes returned io.EOF, because it didn't find another newline, but there is
22+
// still the remainder of the file to return as a line.
23+
line := line_
24+
return line, nil
25+
} else if err != nil {
26+
return nil, err
27+
}
28+
line := bytes.TrimSuffix(line_, []byte{'\n'})
29+
return line, nil
30+
}

0 commit comments

Comments
 (0)