diff options
author | Duncan Ogilvie <mr.exodia.tpodt@gmail.com> | 2017-11-29 00:22:24 +0100 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2017-11-29 01:22:24 +0200 |
commit | c80d147fa911c2aa711bc3f310d7bef11681230b (patch) | |
tree | a0fca9a34d9bea2216df0fbddac338d378420013 | |
parent | d39b88ae886bb4a25e4a488bd1d1db9c1a4eedba (diff) | |
download | gitea-c80d147fa911c2aa711bc3f310d7bef11681230b.tar.gz gitea-c80d147fa911c2aa711bc3f310d7bef11681230b.zip |
Improve memory usage when reaching diff limits (#2990)
Signed-off-by: Duncan Ogilvie <mr.exodia.tpodt@gmail.com>
-rw-r--r-- | models/git_diff.go | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/models/git_diff.go b/models/git_diff.go index 659dfbc0a0..88285fa3e2 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 } |