mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 11:27:40 -04: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,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> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user