From c80d147fa911c2aa711bc3f310d7bef11681230b Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Wed, 29 Nov 2017 00:22:24 +0100 Subject: [PATCH] Improve memory usage when reaching diff limits (#2990) Signed-off-by: Duncan Ogilvie --- models/git_diff.go | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/models/git_diff.go b/models/git_diff.go index 659dfbc0a04..88285fa3e20 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -252,19 +252,27 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D input := bufio.NewReader(reader) isEOF := false for !isEOF { - line, err := input.ReadString('\n') - if err != nil { - if err == io.EOF { - isEOF = true - } else { - return nil, fmt.Errorf("ReadString: %v", err) + var linebuf bytes.Buffer + for { + b, err := input.ReadByte() + if err != nil { + if err == io.EOF { + isEOF = true + break + } else { + return nil, fmt.Errorf("ReadByte: %v", err) + } + } + if b == '\n' { + break + } + if linebuf.Len() < maxLineCharacters { + linebuf.WriteByte(b) + } else if linebuf.Len() == maxLineCharacters { + curFile.IsIncomplete = true } } - - if len(line) > 0 && line[len(line)-1] == '\n' { - // Remove line break. - line = line[:len(line)-1] - } + line := linebuf.String() if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") || len(line) == 0 { continue @@ -295,7 +303,7 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D lineCount++ // Diff data too large, we only show the first about maxLines lines - if curFileLinesCount >= maxLines || len(line) >= maxLineCharacters { + if curFileLinesCount >= maxLines { curFile.IsIncomplete = true }