mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Re-work MAX_DIFF_LINES: supress diff per file, not the whole diff (#3174)
This commit is contained in:
		@@ -328,7 +328,12 @@ RUN_AT_START = true
 | 
				
			|||||||
SCHEDULE = @every 24h
 | 
					SCHEDULE = @every 24h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[git]
 | 
					[git]
 | 
				
			||||||
MAX_GIT_DIFF_LINES = 10000
 | 
					; Max number of lines allowed of a single file in diff view.
 | 
				
			||||||
 | 
					MAX_GIT_DIFF_LINES = 500
 | 
				
			||||||
 | 
					; Max number of characters of a line allowed in diff view.
 | 
				
			||||||
 | 
					MAX_GIT_DIFF_LINE_CHARACTERS = 500
 | 
				
			||||||
 | 
					; Max number of files shown in diff view.
 | 
				
			||||||
 | 
					MAX_GIT_DIFF_FILES = 100
 | 
				
			||||||
; Arguments for command 'git gc', e.g. "--aggressive --auto"
 | 
					; Arguments for command 'git gc', e.g. "--aggressive --auto"
 | 
				
			||||||
; see more on http://git-scm.com/docs/git-gc/1.7.5
 | 
					; see more on http://git-scm.com/docs/git-gc/1.7.5
 | 
				
			||||||
GC_ARGS =
 | 
					GC_ARGS =
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -690,6 +690,8 @@ diff.show_unified_view = Unified View
 | 
				
			|||||||
diff.stats_desc = <strong> %d changed files</strong> with <strong>%d additions</strong> and <strong>%d deletions</strong>
 | 
					diff.stats_desc = <strong> %d changed files</strong> with <strong>%d additions</strong> and <strong>%d deletions</strong>
 | 
				
			||||||
diff.bin = BIN
 | 
					diff.bin = BIN
 | 
				
			||||||
diff.view_file = View File
 | 
					diff.view_file = View File
 | 
				
			||||||
 | 
					diff.file_supressed = File diff supressed because it is too large
 | 
				
			||||||
 | 
					diff.too_many_files = Some files were not shown because too many files changed in this diff
 | 
				
			||||||
 | 
					
 | 
				
			||||||
release.releases = Releases
 | 
					release.releases = Releases
 | 
				
			||||||
release.new_release = New Release
 | 
					release.new_release = New Release
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -161,6 +161,7 @@ type DiffFile struct {
 | 
				
			|||||||
	IsBin              bool
 | 
						IsBin              bool
 | 
				
			||||||
	IsRenamed          bool
 | 
						IsRenamed          bool
 | 
				
			||||||
	Sections           []*DiffSection
 | 
						Sections           []*DiffSection
 | 
				
			||||||
 | 
						IsIncomplete       bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (diffFile *DiffFile) GetType() int {
 | 
					func (diffFile *DiffFile) GetType() int {
 | 
				
			||||||
@@ -174,6 +175,7 @@ func (diffFile *DiffFile) GetHighlightClass() string {
 | 
				
			|||||||
type Diff struct {
 | 
					type Diff struct {
 | 
				
			||||||
	TotalAddition, TotalDeletion int
 | 
						TotalAddition, TotalDeletion int
 | 
				
			||||||
	Files                        []*DiffFile
 | 
						Files                        []*DiffFile
 | 
				
			||||||
 | 
						IsIncomplete                 bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (diff *Diff) NumFiles() int {
 | 
					func (diff *Diff) NumFiles() int {
 | 
				
			||||||
@@ -182,7 +184,7 @@ func (diff *Diff) NumFiles() int {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const DIFF_HEAD = "diff --git "
 | 
					const DIFF_HEAD = "diff --git "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
					func ParsePatch(maxLines, maxLineCharacteres, maxFiles int, reader io.Reader) (*Diff, error) {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		diff = &Diff{Files: make([]*DiffFile, 0)}
 | 
							diff = &Diff{Files: make([]*DiffFile, 0)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -193,15 +195,12 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		leftLine, rightLine int
 | 
							leftLine, rightLine int
 | 
				
			||||||
		lineCount           int
 | 
							lineCount           int
 | 
				
			||||||
 | 
							curFileLinesCount   int
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	input := bufio.NewReader(reader)
 | 
						input := bufio.NewReader(reader)
 | 
				
			||||||
	isEOF := false
 | 
						isEOF := false
 | 
				
			||||||
	for {
 | 
						for !isEOF {
 | 
				
			||||||
		if isEOF {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		line, err := input.ReadString('\n')
 | 
							line, err := input.ReadString('\n')
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if err == io.EOF {
 | 
								if err == io.EOF {
 | 
				
			||||||
@@ -216,20 +215,16 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
				
			|||||||
			line = line[:len(line)-1]
 | 
								line = line[:len(line)-1]
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") {
 | 
							if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") || len(line) == 0 {
 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		} else if len(line) == 0 {
 | 
					 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							curFileLinesCount++
 | 
				
			||||||
		lineCount++
 | 
							lineCount++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Diff data too large, we only show the first about maxlines lines
 | 
							// Diff data too large, we only show the first about maxlines lines
 | 
				
			||||||
		if lineCount >= maxlines {
 | 
							if curFileLinesCount >= maxLines || len(line) >= maxLineCharacteres {
 | 
				
			||||||
			log.Warn("Diff data too large")
 | 
								curFile.IsIncomplete = true
 | 
				
			||||||
			io.Copy(ioutil.Discard, reader)
 | 
					 | 
				
			||||||
			diff.Files = nil
 | 
					 | 
				
			||||||
			return diff, nil
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch {
 | 
							switch {
 | 
				
			||||||
@@ -304,6 +299,12 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
				
			|||||||
				Sections: make([]*DiffSection, 0, 10),
 | 
									Sections: make([]*DiffSection, 0, 10),
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			diff.Files = append(diff.Files, curFile)
 | 
								diff.Files = append(diff.Files, curFile)
 | 
				
			||||||
 | 
								if len(diff.Files) >= maxFiles {
 | 
				
			||||||
 | 
									diff.IsIncomplete = true
 | 
				
			||||||
 | 
									io.Copy(ioutil.Discard, reader)
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								curFileLinesCount = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check file diff type.
 | 
								// Check file diff type.
 | 
				
			||||||
			for {
 | 
								for {
 | 
				
			||||||
@@ -366,7 +367,7 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
				
			|||||||
	return diff, nil
 | 
						return diff, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxlines int) (*Diff, error) {
 | 
					func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
 | 
				
			||||||
	repo, err := git.OpenRepository(repoPath)
 | 
						repo, err := git.OpenRepository(repoPath)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -405,7 +406,7 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxline
 | 
				
			|||||||
	pid := process.Add(fmt.Sprintf("GetDiffRange (%s)", repoPath), cmd)
 | 
						pid := process.Add(fmt.Sprintf("GetDiffRange (%s)", repoPath), cmd)
 | 
				
			||||||
	defer process.Remove(pid)
 | 
						defer process.Remove(pid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diff, err := ParsePatch(maxlines, stdout)
 | 
						diff, err := ParsePatch(maxLines, maxLineCharacteres, maxFiles, stdout)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("ParsePatch: %v", err)
 | 
							return nil, fmt.Errorf("ParsePatch: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -417,6 +418,6 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxline
 | 
				
			|||||||
	return diff, nil
 | 
						return diff, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetDiffCommit(repoPath, commitId string, maxlines int) (*Diff, error) {
 | 
					func GetDiffCommit(repoPath, commitId string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
 | 
				
			||||||
	return GetDiffRange(repoPath, "", commitId, maxlines)
 | 
						return GetDiffRange(repoPath, "", commitId, maxLines, maxLineCharacteres, maxFiles)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,6 +162,8 @@ var (
 | 
				
			|||||||
	// Git settings
 | 
						// Git settings
 | 
				
			||||||
	Git struct {
 | 
						Git struct {
 | 
				
			||||||
		MaxGitDiffLines          int
 | 
							MaxGitDiffLines          int
 | 
				
			||||||
 | 
							MaxGitDiffLineCharacters int
 | 
				
			||||||
 | 
							MaxGitDiffFiles          int
 | 
				
			||||||
		GcArgs                   []string `delim:" "`
 | 
							GcArgs                   []string `delim:" "`
 | 
				
			||||||
		Timeout                  struct {
 | 
							Timeout                  struct {
 | 
				
			||||||
			Migrate int
 | 
								Migrate int
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -157,7 +157,8 @@ func Diff(ctx *context.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName),
 | 
						diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName),
 | 
				
			||||||
		commitID, setting.Git.MaxGitDiffLines)
 | 
							commitID, setting.Git.MaxGitDiffLines,
 | 
				
			||||||
 | 
							setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(404, "GetDiffCommit", err)
 | 
							ctx.Handle(404, "GetDiffCommit", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -212,7 +213,8 @@ func CompareDiff(ctx *context.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diff, err := models.GetDiffRange(models.RepoPath(userName, repoName), beforeCommitID,
 | 
						diff, err := models.GetDiffRange(models.RepoPath(userName, repoName), beforeCommitID,
 | 
				
			||||||
		afterCommitID, setting.Git.MaxGitDiffLines)
 | 
							afterCommitID, setting.Git.MaxGitDiffLines,
 | 
				
			||||||
 | 
							setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(404, "GetDiffRange", err)
 | 
							ctx.Handle(404, "GetDiffRange", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -348,7 +348,8 @@ func ViewPullFiles(ctx *context.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diff, err := models.GetDiffRange(diffRepoPath,
 | 
						diff, err := models.GetDiffRange(diffRepoPath,
 | 
				
			||||||
		startCommitID, endCommitID, setting.Git.MaxGitDiffLines)
 | 
							startCommitID, endCommitID, setting.Git.MaxGitDiffLines,
 | 
				
			||||||
 | 
							setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(500, "GetDiffRange", err)
 | 
							ctx.Handle(500, "GetDiffRange", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -545,7 +546,8 @@ func PrepareCompareDiff(
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	diff, err := models.GetDiffRange(models.RepoPath(headUser.Name, headRepo.Name),
 | 
						diff, err := models.GetDiffRange(models.RepoPath(headUser.Name, headRepo.Name),
 | 
				
			||||||
		prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines)
 | 
							prInfo.MergeBase, headCommitID, setting.Git.MaxGitDiffLines,
 | 
				
			||||||
 | 
							setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(500, "GetDiffRange", err)
 | 
							ctx.Handle(500, "GetDiffRange", err)
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,24 @@
 | 
				
			|||||||
	</div>
 | 
						</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{{range $i, $file := .Diff.Files}}
 | 
						{{range $i, $file := .Diff.Files}}
 | 
				
			||||||
 | 
							{{if $file.IsIncomplete}}
 | 
				
			||||||
 | 
								<div class="diff-file-box diff-box file-content">
 | 
				
			||||||
 | 
									<h4 class="ui top attached normal header">
 | 
				
			||||||
 | 
										{{$.i18n.Tr "repo.diff.file_supressed"}}
 | 
				
			||||||
 | 
										<div class="diff-counter count ui left">
 | 
				
			||||||
 | 
											{{if not $file.IsRenamed}}
 | 
				
			||||||
 | 
												<span class="add" data-line="{{.Addition}}">+ {{.Addition}}</span>
 | 
				
			||||||
 | 
												<span class="bar">
 | 
				
			||||||
 | 
													<span class="pull-left add"></span>
 | 
				
			||||||
 | 
													<span class="pull-left del"></span>
 | 
				
			||||||
 | 
												</span>
 | 
				
			||||||
 | 
												<span class="del" data-line="{{.Deletion}}">- {{.Deletion}}</span>
 | 
				
			||||||
 | 
											{{end}}
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
										<span class="file">{{$file.Name}}</span>
 | 
				
			||||||
 | 
									</h4>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							{{else}}
 | 
				
			||||||
			{{$highlightClass := $file.GetHighlightClass}}
 | 
								{{$highlightClass := $file.GetHighlightClass}}
 | 
				
			||||||
			<div class="diff-file-box diff-box file-content" id="diff-{{.Index}}">
 | 
								<div class="diff-file-box diff-box file-content" id="diff-{{.Index}}">
 | 
				
			||||||
				<h4 class="ui top attached normal header">
 | 
									<h4 class="ui top attached normal header">
 | 
				
			||||||
@@ -118,8 +136,18 @@
 | 
				
			|||||||
					{{end}}
 | 
										{{end}}
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
 | 
							{{end}}
 | 
				
			||||||
	<br>
 | 
						<br>
 | 
				
			||||||
	{{end}}
 | 
						{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{{if .Diff.IsIncomplete}}
 | 
				
			||||||
 | 
							<div class="diff-file-box diff-box file-content">
 | 
				
			||||||
 | 
								<h4 class="ui top attached normal header">
 | 
				
			||||||
 | 
									{{$.i18n.Tr "repo.diff.too_many_files"}}
 | 
				
			||||||
 | 
								</h4>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{{if .IsSplitStyle}}
 | 
						{{if .IsSplitStyle}}
 | 
				
			||||||
		<script>
 | 
							<script>
 | 
				
			||||||
		(function() {
 | 
							(function() {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user