Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions diff/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,11 @@ func (r *MultiFileDiffReader) ReadFileWithTrailingContent() (*FileDiff, string,

fd, err := fr.ReadAllHeaders()
if err != nil {
switch e := err.(type) {
case *ParseError:
if e.Err == ErrNoFileHeader || e.Err == ErrExtendedHeadersEOF {
var pe *ParseError
var oe OverflowError
switch {
case errors.As(err, &pe):
if errors.Is(pe.Err, ErrNoFileHeader) || errors.Is(pe.Err, ErrExtendedHeadersEOF) {
// Any non-diff content preceding a valid diff is included in the
// extended headers of the following diff. In this way, mixed diff /
// non-diff content can be parsed. Trailing non-diff content is
Expand All @@ -91,8 +93,8 @@ func (r *MultiFileDiffReader) ReadFileWithTrailingContent() (*FileDiff, string,
}
return nil, "", err

case OverflowError:
r.nextFileFirstLine = []byte(e)
case errors.As(err, &oe):
r.nextFileFirstLine = []byte(oe)
return fd, "", nil

default:
Expand Down Expand Up @@ -124,8 +126,10 @@ func (r *MultiFileDiffReader) ReadFileWithTrailingContent() (*FileDiff, string,
r.line = fr.line
r.offset = fr.offset
if err != nil {
if e0, ok := err.(*ParseError); ok {
if e, ok := e0.Err.(*ErrBadHunkLine); ok {
var e0 *ParseError
if errors.As(err, &e0) {
var e *ErrBadHunkLine
if errors.As(e0.Err, &e) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add the Unwrap method to ParseError in this PR then we can simplify this and other places so we don't first have to check for ParseError

// This just means we finished reading the hunks for the
// current file. See the ErrBadHunkLine doc for more info.
r.nextFileFirstLine = e.Line
Expand Down Expand Up @@ -224,13 +228,15 @@ func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) {
fd := &FileDiff{}

fd.Extended, err = r.ReadExtendedHeaders()
if pe, ok := err.(*ParseError); ok && pe.Err == ErrExtendedHeadersEOF {
var pe *ParseError
var oe OverflowError
if errors.As(err, &pe) && errors.Is(pe.Err, ErrExtendedHeadersEOF) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code like this make me nervous in general, but I believe its correct. IE we are relying on the first condition to mutate pe so that the second condition doesn't nil panic on pe.Err

wasEmpty := handleEmpty(fd)
if wasEmpty {
return fd, nil
}
return fd, err
} else if _, ok := err.(OverflowError); ok {
} else if errors.As(err, &oe) {
handleEmpty(fd)
return fd, err
} else if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion diff/reader_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func (l *lineReader) nextNextLineStartsWith(prefix string) (bool, error) {
// false and ignore the error when readErr is io.EOF.
func (l *lineReader) lineHasPrefix(line []byte, prefix string, readErr error) (bool, error) {
if readErr != nil {
if readErr == io.EOF || readErr == bufio.ErrBufferFull {
if readErr == io.EOF || errors.Is(readErr, bufio.ErrBufferFull) {
return false, nil
}
return false, readErr
Expand Down
Loading