@@ -12,7 +12,7 @@ RUN_MODE = dev | |||
ROOT = | |||
SCRIPT_TYPE = bash | |||
; Default ANSI charset | |||
ANSI_CHARSET = | |||
ANSI_CHARSET = | |||
; Force every new repository to be private | |||
FORCE_PRIVATE = false | |||
; Global maximum creation limit of repository per user, -1 means no limit | |||
@@ -70,7 +70,7 @@ SSH_PORT = 22 | |||
; Port number builtin SSH server listens on | |||
SSH_LISTEN_PORT = %(SSH_PORT)s | |||
; Root path of SSH directory, default is '~/.ssh', but you have to use '/home/git/.ssh'. | |||
SSH_ROOT_PATH = | |||
SSH_ROOT_PATH = | |||
; Directory to create temporary files when test publick key using ssh-keygen, | |||
; default is system temporary directory. | |||
SSH_KEY_TEST_PATH = | |||
@@ -169,18 +169,18 @@ SUBJECT = %(APP_NAME)s | |||
; Gmail: smtp.gmail.com:587 | |||
; QQ: smtp.qq.com:25 | |||
; Note, if the port ends with "465", SMTPS will be used. Using STARTTLS on port 587 is recommended per RFC 6409. If the server supports STARTTLS it will always be used. | |||
HOST = | |||
HOST = | |||
; Disable HELO operation when hostname are different. | |||
DISABLE_HELO = | |||
DISABLE_HELO = | |||
; Custom hostname for HELO operation, default is from system. | |||
HELO_HOSTNAME = | |||
HELO_HOSTNAME = | |||
; Do not verify the certificate of the server. Only use this for self-signed certificates | |||
SKIP_VERIFY = | |||
SKIP_VERIFY = | |||
; Use client certificate | |||
USE_CERTIFICATE = false | |||
CERT_FILE = custom/mailer/cert.pem | |||
KEY_FILE = custom/mailer/key.pem | |||
; Mail from address, RFC 5322. This can be just an email address, or the `"Name" <email@example.com>` format | |||
; Mail from address, RFC 5322. This can be just an email address, or the `"Name" <email@example.com>` format | |||
FROM = | |||
; Mailer user name and password | |||
USER = | |||
@@ -320,7 +320,7 @@ SCHEDULE = @every 24h | |||
TIMEOUT = 60s | |||
; Arguments for command 'git fsck', e.g. "--unreachable --tags" | |||
; see more on http://git-scm.com/docs/git-fsck/1.7.5 | |||
ARGS = | |||
ARGS = | |||
; Check repository statistics | |||
[cron.check_repo_stats] | |||
@@ -328,10 +328,15 @@ 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 = | |||
GC_ARGS = | |||
; Operation timeout in seconds | |||
[git.timeout] |
@@ -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 |
@@ -48,10 +48,10 @@ const ( | |||
) | |||
type DiffLine struct { | |||
LeftIdx int | |||
RightIdx int | |||
Type DiffLineType | |||
Content string | |||
LeftIdx int | |||
RightIdx int | |||
Type DiffLineType | |||
Content string | |||
} | |||
func (d *DiffLine) GetType() int { | |||
@@ -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) | |||
} |
@@ -161,9 +161,11 @@ var ( | |||
// Git settings | |||
Git struct { | |||
MaxGitDiffLines int | |||
GcArgs []string `delim:" "` | |||
Timeout struct { | |||
MaxGitDiffLines int | |||
MaxGitDiffLineCharacters int | |||
MaxGitDiffFiles int | |||
GcArgs []string `delim:" "` | |||
Timeout struct { | |||
Migrate int | |||
Mirror int | |||
Clone 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,92 +34,120 @@ | |||
</div> | |||
{{range $i, $file := .Diff.Files}} | |||
{{$highlightClass := $file.GetHighlightClass}} | |||
<div class="diff-file-box diff-box file-content" id="diff-{{.Index}}"> | |||
<h4 class="ui top attached normal header"> | |||
<div class="diff-counter count ui left"> | |||
{{if $file.IsBin}} | |||
{{$.i18n.Tr "repo.diff.bin"}} | |||
{{else 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">{{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}}</span> | |||
<div class="ui right"> | |||
{{if $file.IsDeleted}} | |||
<a class="ui basic tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | |||
{{else}} | |||
<a class="ui basic tiny button" rel="nofollow" href="{{EscapePound $.SourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | |||
{{end}} | |||
</div> | |||
</h4> | |||
<div class="ui attached table segment"> | |||
{{if not $file.IsRenamed}} | |||
{{$isImage := (call $.IsImageFile $file.Name)}} | |||
{{if and $isImage}} | |||
<div class="center"> | |||
<img src="{{$.RawPath}}/{{EscapePound .Name}}"> | |||
</div> | |||
{{else}} | |||
<div class="file-body file-code code-view code-diff"> | |||
<table> | |||
<tbody> | |||
{{if $.IsSplitStyle}} | |||
{{range $j, $section := .Sections}} | |||
{{range $k, $line := .Lines}} | |||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}"> | |||
<td class="lines-num lines-num-old"> | |||
<span rel="{{if $line.LeftIdx}}diff-{{Sha1 $file.Name}}L{{$line.LeftIdx}}{{end}}">{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-code halfwidth"> | |||
<pre><code class="wrap {{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{if $line.LeftIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | |||
</td> | |||
<td class="lines-num lines-num-new"> | |||
<span rel="{{if $line.RightIdx}}diff-{{Sha1 $file.Name}}R{{$line.RightIdx}}{{end}}">{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-code halfwidth"> | |||
<pre><code class="wrap {{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{if $line.RightIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | |||
</td> | |||
</tr> | |||
{{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"> | |||
<div class="diff-counter count ui left"> | |||
{{if $file.IsBin}} | |||
{{$.i18n.Tr "repo.diff.bin"}} | |||
{{else 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">{{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}}</span> | |||
<div class="ui right"> | |||
{{if $file.IsDeleted}} | |||
<a class="ui basic tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | |||
{{else}} | |||
<a class="ui basic tiny button" rel="nofollow" href="{{EscapePound $.SourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | |||
{{end}} | |||
</div> | |||
</h4> | |||
<div class="ui attached table segment"> | |||
{{if not $file.IsRenamed}} | |||
{{$isImage := (call $.IsImageFile $file.Name)}} | |||
{{if and $isImage}} | |||
<div class="center"> | |||
<img src="{{$.RawPath}}/{{EscapePound .Name}}"> | |||
</div> | |||
{{else}} | |||
<div class="file-body file-code code-view code-diff"> | |||
<table> | |||
<tbody> | |||
{{if $.IsSplitStyle}} | |||
{{range $j, $section := .Sections}} | |||
{{range $k, $line := .Lines}} | |||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}"> | |||
<td class="lines-num lines-num-old"> | |||
<span rel="{{if $line.LeftIdx}}diff-{{Sha1 $file.Name}}L{{$line.LeftIdx}}{{end}}">{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-code halfwidth"> | |||
<pre><code class="wrap {{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{if $line.LeftIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | |||
</td> | |||
<td class="lines-num lines-num-new"> | |||
<span rel="{{if $line.RightIdx}}diff-{{Sha1 $file.Name}}R{{$line.RightIdx}}{{end}}">{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-code halfwidth"> | |||
<pre><code class="wrap {{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{if $line.RightIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}</code></pre> | |||
</td> | |||
</tr> | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
{{else}} | |||
{{range $j, $section := .Sections}} | |||
{{range $k, $line := .Lines}} | |||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}"> | |||
{{if eq .GetType 4}} | |||
<td colspan="2" class="lines-num"> | |||
{{/* {{if gt $j 0}}<span class="fold octicon octicon-fold"></span>{{end}} */}} | |||
</td> | |||
{{else}} | |||
<td class="lines-num lines-num-old"> | |||
<span rel="{{if $line.LeftIdx}}diff-{{Sha1 $file.Name}}L{{$line.LeftIdx}}{{end}}">{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-num lines-num-new"> | |||
<span rel="{{if $line.RightIdx}}diff-{{Sha1 $file.Name}}R{{$line.RightIdx}}{{end}}">{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}</span> | |||
</td> | |||
{{end}} | |||
<td class="lines-code"> | |||
<pre><code class="{{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{$section.GetComputedInlineDiffFor $line}}</code></pre> | |||
</td> | |||
</tr> | |||
{{else}} | |||
{{range $j, $section := .Sections}} | |||
{{range $k, $line := .Lines}} | |||
<tr class="{{DiffLineTypeToStr .GetType}}-code nl-{{$k}} ol-{{$k}}"> | |||
{{if eq .GetType 4}} | |||
<td colspan="2" class="lines-num"> | |||
{{/* {{if gt $j 0}}<span class="fold octicon octicon-fold"></span>{{end}} */}} | |||
</td> | |||
{{else}} | |||
<td class="lines-num lines-num-old"> | |||
<span rel="{{if $line.LeftIdx}}diff-{{Sha1 $file.Name}}L{{$line.LeftIdx}}{{end}}">{{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}</span> | |||
</td> | |||
<td class="lines-num lines-num-new"> | |||
<span rel="{{if $line.RightIdx}}diff-{{Sha1 $file.Name}}R{{$line.RightIdx}}{{end}}">{{if $line.RightIdx}}{{$line.RightIdx}}{{end}}</span> | |||
</td> | |||
{{end}} | |||
<td class="lines-code"> | |||
<pre><code class="{{if $highlightClass}}language-{{$highlightClass}}{{else}}nohighlight{{end}}">{{$section.GetComputedInlineDiffFor $line}}</code></pre> | |||
</td> | |||
</tr> | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
</tbody> | |||
</table> | |||
</div> | |||
</tbody> | |||
</table> | |||
</div> | |||
{{end}} | |||
{{end}} | |||
{{end}} | |||
</div> | |||
</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() { |