aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan Ogilvie <mr.exodia.tpodt@gmail.com>2017-11-29 00:22:24 +0100
committerLauris BH <lauris@nix.lv>2017-11-29 01:22:24 +0200
commitc80d147fa911c2aa711bc3f310d7bef11681230b (patch)
treea0fca9a34d9bea2216df0fbddac338d378420013
parentd39b88ae886bb4a25e4a488bd1d1db9c1a4eedba (diff)
downloadgitea-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.go32
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
}