mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08: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:
		@@ -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,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>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user