Currently you can see a list of commit history for wiki pages but aren't able to view the commit diff itself. This adds the feature to view an individual commit to a wiki repo. Closes #8999 Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>tags/v1.21.12.1
| @@ -212,8 +212,25 @@ func Diff(ctx *context.Context) { | |||||
| userName := ctx.Repo.Owner.Name | userName := ctx.Repo.Owner.Name | ||||
| repoName := ctx.Repo.Repository.Name | repoName := ctx.Repo.Repository.Name | ||||
| commitID := ctx.Params(":sha") | commitID := ctx.Params(":sha") | ||||
| var ( | |||||
| gitRepo *git.Repository | |||||
| err error | |||||
| repoPath string | |||||
| ) | |||||
| if ctx.Data["PageIsWiki"] != nil { | |||||
| gitRepo, err = git.OpenRepository(ctx.Repo.Repository.WikiPath()) | |||||
| if err != nil { | |||||
| ctx.ServerError("Repo.GitRepo.GetCommit", err) | |||||
| return | |||||
| } | |||||
| repoPath = ctx.Repo.Repository.WikiPath() | |||||
| } else { | |||||
| gitRepo = ctx.Repo.GitRepo | |||||
| repoPath = models.RepoPath(userName, repoName) | |||||
| } | |||||
| commit, err := ctx.Repo.GitRepo.GetCommit(commitID) | |||||
| commit, err := gitRepo.GetCommit(commitID) | |||||
| if err != nil { | if err != nil { | ||||
| if git.IsErrNotExist(err) { | if git.IsErrNotExist(err) { | ||||
| ctx.NotFound("Repo.GitRepo.GetCommit", err) | ctx.NotFound("Repo.GitRepo.GetCommit", err) | ||||
| @@ -233,7 +250,7 @@ func Diff(ctx *context.Context) { | |||||
| ctx.Data["CommitStatus"] = models.CalcCommitStatus(statuses) | ctx.Data["CommitStatus"] = models.CalcCommitStatus(statuses) | ||||
| diff, err := gitdiff.GetDiffCommit(models.RepoPath(userName, repoName), | |||||
| diff, err := gitdiff.GetDiffCommit(repoPath, | |||||
| commitID, setting.Git.MaxGitDiffLines, | commitID, setting.Git.MaxGitDiffLines, | ||||
| setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles) | setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -258,7 +275,7 @@ func Diff(ctx *context.Context) { | |||||
| var parentCommit *git.Commit | var parentCommit *git.Commit | ||||
| if commit.ParentCount() > 0 { | if commit.ParentCount() > 0 { | ||||
| parentCommit, err = ctx.Repo.GitRepo.GetCommit(parents[0]) | |||||
| parentCommit, err = gitRepo.GetCommit(parents[0]) | |||||
| if err != nil { | if err != nil { | ||||
| ctx.NotFound("GetParentCommit", err) | ctx.NotFound("GetParentCommit", err) | ||||
| return | return | ||||
| @@ -298,8 +315,14 @@ func Diff(ctx *context.Context) { | |||||
| // RawDiff dumps diff results of repository in given commit ID to io.Writer | // RawDiff dumps diff results of repository in given commit ID to io.Writer | ||||
| func RawDiff(ctx *context.Context) { | func RawDiff(ctx *context.Context) { | ||||
| var repoPath string | |||||
| if ctx.Data["PageIsWiki"] != nil { | |||||
| repoPath = ctx.Repo.Repository.WikiPath() | |||||
| } else { | |||||
| repoPath = models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) | |||||
| } | |||||
| if err := git.GetRawDiff( | if err := git.GetRawDiff( | ||||
| models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name), | |||||
| repoPath, | |||||
| ctx.Params(":sha"), | ctx.Params(":sha"), | ||||
| git.RawDiffType(ctx.Params(":ext")), | git.RawDiffType(ctx.Params(":ext")), | ||||
| ctx.Resp, | ctx.Resp, | ||||
| @@ -245,6 +245,8 @@ func renderRevisionPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) | |||||
| ctx.Data["Title"] = pageName | ctx.Data["Title"] = pageName | ||||
| ctx.Data["title"] = pageName | ctx.Data["title"] = pageName | ||||
| ctx.Data["RequireHighlightJS"] = true | ctx.Data["RequireHighlightJS"] = true | ||||
| ctx.Data["Username"] = ctx.Repo.Owner.Name | |||||
| ctx.Data["Reponame"] = ctx.Repo.Repository.Name | |||||
| //lookup filename in wiki - get filecontent, gitTree entry , real filename | //lookup filename in wiki - get filecontent, gitTree entry , real filename | ||||
| data, entry, pageFilename, noEntry := wikiContentsByName(ctx, commit, pageName) | data, entry, pageFilename, noEntry := wikiContentsByName(ctx, commit, pageName) | ||||
| @@ -857,6 +857,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Get("/?:page", repo.Wiki) | m.Get("/?:page", repo.Wiki) | ||||
| m.Get("/_pages", repo.WikiPages) | m.Get("/_pages", repo.WikiPages) | ||||
| m.Get("/:page/_revision", repo.WikiRevision) | m.Get("/:page/_revision", repo.WikiRevision) | ||||
| m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.Diff) | |||||
| m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff) | |||||
| m.Group("", func() { | m.Group("", func() { | ||||
| m.Combo("/_new").Get(repo.NewWiki). | m.Combo("/_new").Get(repo.NewWiki). | ||||
| @@ -865,7 +867,9 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost) | Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost) | ||||
| m.Post("/:page/delete", repo.DeleteWikiPagePost) | m.Post("/:page/delete", repo.DeleteWikiPagePost) | ||||
| }, context.RepoMustNotBeArchived(), reqSignIn, reqRepoWikiWriter) | }, context.RepoMustNotBeArchived(), reqSignIn, reqRepoWikiWriter) | ||||
| }, repo.MustEnableWiki, context.RepoRef()) | |||||
| }, repo.MustEnableWiki, context.RepoRef(), func(ctx *context.Context) { | |||||
| ctx.Data["PageIsWiki"] = true | |||||
| }) | |||||
| m.Group("/wiki", func() { | m.Group("/wiki", func() { | ||||
| m.Get("/raw/*", repo.WikiRaw) | m.Get("/raw/*", repo.WikiRaw) | ||||
| @@ -18,9 +18,11 @@ | |||||
| {{end}} | {{end}} | ||||
| {{end}} | {{end}} | ||||
| <div class="ui top attached info clearing segment {{$class}}"> | <div class="ui top attached info clearing segment {{$class}}"> | ||||
| {{if not $.PageIsWiki}} | |||||
| <a class="ui floated right blue tiny button" href="{{EscapePound .SourcePath}}"> | <a class="ui floated right blue tiny button" href="{{EscapePound .SourcePath}}"> | ||||
| {{.i18n.Tr "repo.diff.browse_source"}} | {{.i18n.Tr "repo.diff.browse_source"}} | ||||
| </a> | </a> | ||||
| {{end}} | |||||
| <h3><span class="message-wrapper"><span class="commit-summary" title="{{.Commit.Summary}}">{{RenderCommitMessage .Commit.Message $.RepoLink $.Repository.ComposeMetas}}</span></span>{{template "repo/commit_status" .CommitStatus}}</h3> | <h3><span class="message-wrapper"><span class="commit-summary" title="{{.Commit.Summary}}">{{RenderCommitMessage .Commit.Message $.RepoLink $.Repository.ComposeMetas}}</span></span>{{template "repo/commit_status" .CommitStatus}}</h3> | ||||
| {{if IsMultilineCommitMessage .Commit.Message}} | {{if IsMultilineCommitMessage .Commit.Message}} | ||||
| <pre class="commit-body">{{RenderCommitBody .Commit.Message $.RepoLink $.Repository.ComposeMetas}}</pre> | <pre class="commit-body">{{RenderCommitBody .Commit.Message $.RepoLink $.Repository.ComposeMetas}}</pre> | ||||
| @@ -61,7 +63,11 @@ | |||||
| </div> | </div> | ||||
| <div class="item"> | <div class="item"> | ||||
| {{range .Parents}} | {{range .Parents}} | ||||
| <a class="ui blue sha label" href="{{$.RepoLink}}/commit/{{.}}">{{ShortSha .}}</a> | |||||
| {{if $.PageIsWiki}} | |||||
| <a class="ui blue sha label" href="{{$.RepoLink}}/wiki/commit/{{.}}">{{ShortSha .}}</a> | |||||
| {{else}} | |||||
| <a class="ui blue sha label" href="{{$.RepoLink}}/commit/{{.}}">{{ShortSha .}}</a> | |||||
| {{end}} | |||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| {{end}} | {{end}} | ||||
| @@ -39,7 +39,9 @@ | |||||
| {{$class = (printf "%s%s" $class " isWarning")}} | {{$class = (printf "%s%s" $class " isWarning")}} | ||||
| {{end}} | {{end}} | ||||
| {{end}} | {{end}} | ||||
| {{if $.Reponame}} | |||||
| {{if $.PageIsWiki}} | |||||
| <a href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/wiki/commit/{{.ID}}" rel="nofollow" class="{{$class}}"> | |||||
| {{else if $.Reponame}} | |||||
| <a href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{.ID}}" rel="nofollow" class="{{$class}}"> | <a href="{{AppSubUrl}}/{{$.Username}}/{{$.Reponame}}/commit/{{.ID}}" rel="nofollow" class="{{$class}}"> | ||||
| {{else}} | {{else}} | ||||
| <span class="{{$class}}"> | <span class="{{$class}}"> | ||||
| @@ -69,7 +69,7 @@ | |||||
| </div> | </div> | ||||
| <span class="file">{{$file.Name}}</span> | <span class="file">{{$file.Name}}</span> | ||||
| <div>{{$.i18n.Tr "repo.diff.file_suppressed"}}</div> | <div>{{$.i18n.Tr "repo.diff.file_suppressed"}}</div> | ||||
| {{if not $file.IsSubmodule}} | |||||
| {{if and (not $file.IsSubmodule) (not $.PageIsWiki)}} | |||||
| {{if $file.IsDeleted}} | {{if $file.IsDeleted}} | ||||
| <a class="ui basic grey tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | <a class="ui basic grey tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | ||||
| {{else}} | {{else}} | ||||
| @@ -103,7 +103,7 @@ | |||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| <span class="file">{{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}}{{if .IsLFSFile}} ({{$.i18n.Tr "repo.stored_lfs"}}){{end}}</span> | <span class="file">{{if $file.IsRenamed}}{{$file.OldName}} → {{end}}{{$file.Name}}{{if .IsLFSFile}} ({{$.i18n.Tr "repo.stored_lfs"}}){{end}}</span> | ||||
| {{if not $file.IsSubmodule}} | |||||
| {{if and (not $file.IsSubmodule) (not $.PageIsWiki)}} | |||||
| {{if $file.IsDeleted}} | {{if $file.IsDeleted}} | ||||
| <a class="ui basic grey tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | <a class="ui basic grey tiny button" rel="nofollow" href="{{EscapePound $.BeforeSourcePath}}/{{EscapePound .Name}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> | ||||
| {{else}} | {{else}} | ||||
| @@ -6,6 +6,9 @@ | |||||
| {{if .Issue.Index}} | {{if .Issue.Index}} | ||||
| <a class="item" href="{{$.RepoLink}}/pulls/{{.Issue.Index}}.patch" download="{{.Issue.Index}}.patch">{{.i18n.Tr "repo.diff.download_patch"}}</a> | <a class="item" href="{{$.RepoLink}}/pulls/{{.Issue.Index}}.patch" download="{{.Issue.Index}}.patch">{{.i18n.Tr "repo.diff.download_patch"}}</a> | ||||
| <a class="item" href="{{$.RepoLink}}/pulls/{{.Issue.Index}}.diff" download="{{.Issue.Index}}.diff">{{.i18n.Tr "repo.diff.download_diff"}}</a> | <a class="item" href="{{$.RepoLink}}/pulls/{{.Issue.Index}}.diff" download="{{.Issue.Index}}.diff">{{.i18n.Tr "repo.diff.download_diff"}}</a> | ||||
| {{else if $.PageIsWiki}} | |||||
| <a class="item" href="{{$.RepoLink}}/wiki/commit/{{.Commit.ID.String}}.patch" download="{{ShortSha .Commit.ID.String}}.patch">{{.i18n.Tr "repo.diff.download_patch"}}</a> | |||||
| <a class="item" href="{{$.RepoLink}}/wiki/commit/{{.Commit.ID.String}}.diff" download="{{ShortSha .Commit.ID.String}}.diff">{{.i18n.Tr "repo.diff.download_diff"}}</a> | |||||
| {{else if .Commit.ID.String}} | {{else if .Commit.ID.String}} | ||||
| <a class="item" href="{{$.RepoLink}}/commit/{{.Commit.ID.String}}.patch" download="{{ShortSha .Commit.ID.String}}.patch">{{.i18n.Tr "repo.diff.download_patch"}}</a> | <a class="item" href="{{$.RepoLink}}/commit/{{.Commit.ID.String}}.patch" download="{{ShortSha .Commit.ID.String}}.patch">{{.i18n.Tr "repo.diff.download_patch"}}</a> | ||||
| <a class="item" href="{{$.RepoLink}}/commit/{{.Commit.ID.String}}.diff" download="{{ShortSha .Commit.ID.String}}.diff">{{.i18n.Tr "repo.diff.download_diff"}}</a> | <a class="item" href="{{$.RepoLink}}/commit/{{.Commit.ID.String}}.diff" download="{{ShortSha .Commit.ID.String}}.diff">{{.i18n.Tr "repo.diff.download_diff"}}</a> | ||||