mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +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
 | 
			
		||||
 | 
			
		||||
[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"
 | 
			
		||||
; see more on http://git-scm.com/docs/git-gc/1.7.5
 | 
			
		||||
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.bin = BIN
 | 
			
		||||
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.new_release = New Release
 | 
			
		||||
 
 | 
			
		||||
@@ -161,6 +161,7 @@ type DiffFile struct {
 | 
			
		||||
	IsBin              bool
 | 
			
		||||
	IsRenamed          bool
 | 
			
		||||
	Sections           []*DiffSection
 | 
			
		||||
	IsIncomplete       bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (diffFile *DiffFile) GetType() int {
 | 
			
		||||
@@ -174,6 +175,7 @@ func (diffFile *DiffFile) GetHighlightClass() string {
 | 
			
		||||
type Diff struct {
 | 
			
		||||
	TotalAddition, TotalDeletion int
 | 
			
		||||
	Files                        []*DiffFile
 | 
			
		||||
	IsIncomplete                 bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (diff *Diff) NumFiles() int {
 | 
			
		||||
@@ -182,7 +184,7 @@ func (diff *Diff) NumFiles() int {
 | 
			
		||||
 | 
			
		||||
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 (
 | 
			
		||||
		diff = &Diff{Files: make([]*DiffFile, 0)}
 | 
			
		||||
 | 
			
		||||
@@ -193,15 +195,12 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
			
		||||
 | 
			
		||||
		leftLine, rightLine int
 | 
			
		||||
		lineCount           int
 | 
			
		||||
		curFileLinesCount   int
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	input := bufio.NewReader(reader)
 | 
			
		||||
	isEOF := false
 | 
			
		||||
	for {
 | 
			
		||||
		if isEOF {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	for !isEOF {
 | 
			
		||||
		line, err := input.ReadString('\n')
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == io.EOF {
 | 
			
		||||
@@ -216,20 +215,16 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
			
		||||
			line = line[:len(line)-1]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if len(line) == 0 {
 | 
			
		||||
		if strings.HasPrefix(line, "+++ ") || strings.HasPrefix(line, "--- ") || len(line) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		curFileLinesCount++
 | 
			
		||||
		lineCount++
 | 
			
		||||
 | 
			
		||||
		// Diff data too large, we only show the first about maxlines lines
 | 
			
		||||
		if lineCount >= maxlines {
 | 
			
		||||
			log.Warn("Diff data too large")
 | 
			
		||||
			io.Copy(ioutil.Discard, reader)
 | 
			
		||||
			diff.Files = nil
 | 
			
		||||
			return diff, nil
 | 
			
		||||
		if curFileLinesCount >= maxLines || len(line) >= maxLineCharacteres {
 | 
			
		||||
			curFile.IsIncomplete = true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch {
 | 
			
		||||
@@ -304,6 +299,12 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
			
		||||
				Sections: make([]*DiffSection, 0, 10),
 | 
			
		||||
			}
 | 
			
		||||
			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.
 | 
			
		||||
			for {
 | 
			
		||||
@@ -366,7 +367,7 @@ func ParsePatch(maxlines int, reader io.Reader) (*Diff, error) {
 | 
			
		||||
	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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -405,7 +406,7 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxline
 | 
			
		||||
	pid := process.Add(fmt.Sprintf("GetDiffRange (%s)", repoPath), cmd)
 | 
			
		||||
	defer process.Remove(pid)
 | 
			
		||||
 | 
			
		||||
	diff, err := ParsePatch(maxlines, stdout)
 | 
			
		||||
	diff, err := ParsePatch(maxLines, maxLineCharacteres, maxFiles, stdout)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("ParsePatch: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -417,6 +418,6 @@ func GetDiffRange(repoPath, beforeCommitID string, afterCommitID string, maxline
 | 
			
		||||
	return diff, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetDiffCommit(repoPath, commitId string, maxlines int) (*Diff, error) {
 | 
			
		||||
	return GetDiffRange(repoPath, "", commitId, maxlines)
 | 
			
		||||
func GetDiffCommit(repoPath, commitId string, maxLines, maxLineCharacteres, maxFiles int) (*Diff, error) {
 | 
			
		||||
	return GetDiffRange(repoPath, "", commitId, maxLines, maxLineCharacteres, maxFiles)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -162,6 +162,8 @@ var (
 | 
			
		||||
	// Git settings
 | 
			
		||||
	Git struct {
 | 
			
		||||
		MaxGitDiffLines          int
 | 
			
		||||
		MaxGitDiffLineCharacters int
 | 
			
		||||
		MaxGitDiffFiles          int
 | 
			
		||||
		GcArgs                   []string `delim:" "`
 | 
			
		||||
		Timeout                  struct {
 | 
			
		||||
			Migrate int
 | 
			
		||||
 
 | 
			
		||||
@@ -157,7 +157,8 @@ func Diff(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		ctx.Handle(404, "GetDiffCommit", err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -212,7 +213,8 @@ func CompareDiff(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		ctx.Handle(404, "GetDiffRange", err)
 | 
			
		||||
		return
 | 
			
		||||
 
 | 
			
		||||
@@ -348,7 +348,8 @@ func ViewPullFiles(ctx *context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	diff, err := models.GetDiffRange(diffRepoPath,
 | 
			
		||||
		startCommitID, endCommitID, setting.Git.MaxGitDiffLines)
 | 
			
		||||
		startCommitID, endCommitID, setting.Git.MaxGitDiffLines,
 | 
			
		||||
		setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Handle(500, "GetDiffRange", err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -545,7 +546,8 @@ func PrepareCompareDiff(
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		ctx.Handle(500, "GetDiffRange", err)
 | 
			
		||||
		return false
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,24 @@
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
	{{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}}
 | 
			
		||||
			<div class="diff-file-box diff-box file-content" id="diff-{{.Index}}">
 | 
			
		||||
				<h4 class="ui top attached normal header">
 | 
			
		||||
@@ -118,8 +136,18 @@
 | 
			
		||||
					{{end}}
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
		{{end}}
 | 
			
		||||
	<br>
 | 
			
		||||
	{{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}}
 | 
			
		||||
		<script>
 | 
			
		||||
		(function() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user