mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-01 09:51:39 -05:00
Support view individual commit for wiki pages (#11415)
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>
This commit is contained in:
parent
6603045476
commit
b2b86ea870
7 changed files with 49 additions and 9 deletions
|
@ -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
|
||||||
|
)
|
||||||
|
|
||||||
commit, err := ctx.Repo.GitRepo.GetCommit(commitID)
|
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 := 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,8 +63,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
{{range .Parents}}
|
{{range .Parents}}
|
||||||
|
{{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>
|
<a class="ui blue sha label" href="{{$.RepoLink}}/commit/{{.}}">{{ShortSha .}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
<div class="mobile-only"></div>
|
<div class="mobile-only"></div>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue