diff --git a/models/git_diff.go b/models/git_diff.go index 1913ec46e..e8bfe6102 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -51,7 +51,6 @@ type DiffLine struct { RightIdx int Type DiffLineType Content string - ParsedContent template.HTML } func (d *DiffLine) GetType() int { @@ -112,42 +111,42 @@ func (diffSection *DiffSection) GetLine(lineType DiffLineType, idx int) *DiffLin return nil } -// computes diff of each diff line and set the HTML on diffLine.ParsedContent -func (diffSection *DiffSection) ComputeLinesDiff() { - for _, diffLine := range diffSection.Lines { - var compareDiffLine *DiffLine - var diff1, diff2 string +// computes inline diff for the given line +func (diffSection *DiffSection) GetComputedInlineDiffFor(diffLine *DiffLine) template.HTML { + var compareDiffLine *DiffLine + var diff1, diff2 string - diffLine.ParsedContent = template.HTML(html.EscapeString(diffLine.Content[1:])) - - // just compute diff for adds and removes - if diffLine.Type != DIFF_LINE_ADD && diffLine.Type != DIFF_LINE_DEL { - continue - } - - // try to find equivalent diff line. ignore, otherwise - if diffLine.Type == DIFF_LINE_ADD { - compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx) - if compareDiffLine == nil { - continue - } - diff1 = compareDiffLine.Content - diff2 = diffLine.Content - } else { - compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx) - if compareDiffLine == nil { - continue - } - diff1 = diffLine.Content - diff2 = compareDiffLine.Content - } - - dmp := diffmatchpatch.New() - diffRecord := dmp.DiffMain(diff1[1:], diff2[1:], true) - diffRecord = dmp.DiffCleanupSemantic(diffRecord) - - diffLine.ParsedContent = diffToHTML(diffRecord, diffLine.Type) + getDefaultReturn := func() template.HTML { + return template.HTML(html.EscapeString(diffLine.Content[1:])) } + + // just compute diff for adds and removes + if diffLine.Type != DIFF_LINE_ADD && diffLine.Type != DIFF_LINE_DEL { + return getDefaultReturn() + } + + // try to find equivalent diff line. ignore, otherwise + if diffLine.Type == DIFF_LINE_ADD { + compareDiffLine = diffSection.GetLine(DIFF_LINE_DEL, diffLine.RightIdx) + if compareDiffLine == nil { + return getDefaultReturn() + } + diff1 = compareDiffLine.Content + diff2 = diffLine.Content + } else { + compareDiffLine = diffSection.GetLine(DIFF_LINE_ADD, diffLine.LeftIdx) + if compareDiffLine == nil { + return getDefaultReturn() + } + diff1 = diffLine.Content + diff2 = compareDiffLine.Content + } + + dmp := diffmatchpatch.New() + diffRecord := dmp.DiffMain(diff1[1:], diff2[1:], true) + diffRecord = dmp.DiffCleanupSemantic(diffRecord) + + return diffToHTML(diffRecord, diffLine.Type) } type DiffFile struct { diff --git a/routers/repo/commit.go b/routers/repo/commit.go index 9e46c2e84..c3fc4d177 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -168,12 +168,6 @@ func Diff(ctx *middleware.Context) { } } - for _, diffFile := range diff.Files { - for _, diffSection := range diffFile.Sections { - diffSection.ComputeLinesDiff() - } - } - ctx.Data["IsSplitStyle"] = ctx.Query("style") == "split" ctx.Data["Username"] = userName ctx.Data["Reponame"] = repoName diff --git a/routers/repo/pull.go b/routers/repo/pull.go index 770ec471e..e3500716d 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -349,12 +349,6 @@ func ViewPullFiles(ctx *middleware.Context) { ctx.Data["Diff"] = diff ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 - for _, diffFile := range diff.Files { - for _, diffSection := range diffFile.Sections { - diffSection.ComputeLinesDiff() - } - } - commit, err := gitRepo.GetCommit(endCommitID) if err != nil { ctx.Handle(500, "GetCommit", err) diff --git a/templates/repo/diff_box.tmpl b/templates/repo/diff_box.tmpl index da512ebf0..4ea531c3c 100644 --- a/templates/repo/diff_box.tmpl +++ b/templates/repo/diff_box.tmpl @@ -76,13 +76,13 @@ {{if $line.LeftIdx}}{{$line.LeftIdx}}{{end}}
{{if $line.LeftIdx}}{{$line.ParsedContent}}{{end}}+
{{if $line.LeftIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}
{{if $line.RightIdx}}{{$line.ParsedContent}}{{end}}+
{{if $line.RightIdx}}{{$section.GetComputedInlineDiffFor $line}}{{end}}
{{$line.ParsedContent}}+
{{$section.GetComputedInlineDiffFor $line}}