@@ -23,14 +23,14 @@ func ParseMultiFileDiff(diff []byte) ([]*FileDiff, error) {
23
23
// NewMultiFileDiffReader returns a new MultiFileDiffReader that reads
24
24
// a multi-file unified diff from r.
25
25
func NewMultiFileDiffReader (r io.Reader ) * MultiFileDiffReader {
26
- return & MultiFileDiffReader {reader : bufio . NewReader (r )}
26
+ return & MultiFileDiffReader {reader : newLineReader (r )}
27
27
}
28
28
29
29
// MultiFileDiffReader reads a multi-file unified diff.
30
30
type MultiFileDiffReader struct {
31
31
line int
32
32
offset int64
33
- reader * bufio. Reader
33
+ reader * lineReader
34
34
35
35
// TODO(sqs): line and offset tracking in multi-file diffs is broken; add tests and fix
36
36
@@ -85,7 +85,7 @@ func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) {
85
85
// caused by the lack of any hunks, or a malformatted hunk, so we
86
86
// need to perform the check here.
87
87
hr := fr .HunksReader ()
88
- line , err := readLine ( r .reader )
88
+ line , err := r .reader . readLine ( )
89
89
if err != nil && err != io .EOF {
90
90
return fd , err
91
91
}
@@ -141,14 +141,14 @@ func ParseFileDiff(diff []byte) (*FileDiff, error) {
141
141
// NewFileDiffReader returns a new FileDiffReader that reads a file
142
142
// unified diff.
143
143
func NewFileDiffReader (r io.Reader ) * FileDiffReader {
144
- return & FileDiffReader {reader : bufio .NewReader (r )}
144
+ return & FileDiffReader {reader : & lineReader { reader : bufio .NewReader (r )} }
145
145
}
146
146
147
147
// FileDiffReader reads a unified file diff.
148
148
type FileDiffReader struct {
149
149
line int
150
150
offset int64
151
- reader * bufio. Reader
151
+ reader * lineReader
152
152
153
153
// fileHeaderLine is the first file header line, set by:
154
154
//
@@ -266,7 +266,7 @@ func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, time
266
266
267
267
if r .fileHeaderLine == nil {
268
268
var err error
269
- line , err = readLine ( r .reader )
269
+ line , err = r .reader . readLine ( )
270
270
if err == io .EOF {
271
271
return "" , nil , & ParseError {r .line , r .offset , ErrNoFileHeader }
272
272
} else if err != nil {
@@ -318,7 +318,7 @@ func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
318
318
var line []byte
319
319
if r .fileHeaderLine == nil {
320
320
var err error
321
- line , err = readLine ( r .reader )
321
+ line , err = r .reader . readLine ( )
322
322
if err == io .EOF {
323
323
return xheaders , & ParseError {r .line , r .offset , ErrExtendedHeadersEOF }
324
324
} else if err != nil {
@@ -447,15 +447,15 @@ func ParseHunks(diff []byte) ([]*Hunk, error) {
447
447
// NewHunksReader returns a new HunksReader that reads unified diff hunks
448
448
// from r.
449
449
func NewHunksReader (r io.Reader ) * HunksReader {
450
- return & HunksReader {reader : bufio .NewReader (r )}
450
+ return & HunksReader {reader : & lineReader { reader : bufio .NewReader (r )} }
451
451
}
452
452
453
453
// A HunksReader reads hunks from a unified diff.
454
454
type HunksReader struct {
455
455
line int
456
456
offset int64
457
457
hunk * Hunk
458
- reader * bufio. Reader
458
+ reader * lineReader
459
459
460
460
nextHunkHeaderLine []byte
461
461
}
@@ -474,7 +474,7 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) {
474
474
line = r .nextHunkHeaderLine
475
475
r .nextHunkHeaderLine = nil
476
476
} else {
477
- line , err = readLine ( r .reader )
477
+ line , err = r .reader . readLine ( )
478
478
if err != nil {
479
479
if err == io .EOF && r .hunk != nil {
480
480
return r .hunk , nil
@@ -518,12 +518,15 @@ func (r *HunksReader) ReadHunk() (*Hunk, error) {
518
518
// If the line starts with `---` and the next one with `+++` we're
519
519
// looking at a non-extended file header and need to abort.
520
520
if bytes .HasPrefix (line , []byte ("---" )) {
521
- ok , err := peekPrefix ( r .reader , "+++" )
521
+ ok , err := r .reader . nextLineStartsWith ( "+++" )
522
522
if err != nil {
523
523
return r .hunk , err
524
524
}
525
525
if ok {
526
- return r .hunk , & ParseError {r .line , r .offset , & ErrBadHunkLine {Line : line }}
526
+ ok2 , _ := r .reader .nextNextLineStartsWith (string (hunkPrefix ))
527
+ if ok2 {
528
+ return r .hunk , & ParseError {r .line , r .offset , & ErrBadHunkLine {Line : line }}
529
+ }
527
530
}
528
531
}
529
532
@@ -593,19 +596,6 @@ func linePrefix(c byte) bool {
593
596
return false
594
597
}
595
598
596
- // peekPrefix peeks into the given reader to check whether the next
597
- // bytes match the given prefix.
598
- func peekPrefix (reader * bufio.Reader , prefix string ) (bool , error ) {
599
- next , err := reader .Peek (len (prefix ))
600
- if err != nil {
601
- if err == io .EOF {
602
- return false , nil
603
- }
604
- return false , err
605
- }
606
- return bytes .HasPrefix (next , []byte (prefix )), nil
607
- }
608
-
609
599
// normalizeHeader takes a header of the form:
610
600
// "@@ -linestart[,chunksize] +linestart[,chunksize] @@ section"
611
601
// and returns two strings, with the first in the form:
0 commit comments