diff options
author | KN4CK3R <admin@oldschoolhack.me> | 2024-02-19 11:27:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-19 10:27:05 +0000 |
commit | 7e8ff709401d09467c3eee7c69cd9600d26a97a3 (patch) | |
tree | cc839314df0f30e770f3ca8297dfd79c630ea39e | |
parent | a11ccc9fcd61fb25ffb1c37b87a0df4ee9efd84e (diff) | |
download | gitea-7e8ff709401d09467c3eee7c69cd9600d26a97a3.tar.gz gitea-7e8ff709401d09467c3eee7c69cd9600d26a97a3.zip |
Show commit status for releases (#29149)
Fixes #29082
![grafik](https://github.com/go-gitea/gitea/assets/1666336/bb2ccde1-ee99-459d-9e74-0fb8ea79e8b3)
-rw-r--r-- | routers/web/repo/release.go | 174 | ||||
-rw-r--r-- | services/actions/commit_status.go | 3 | ||||
-rw-r--r-- | templates/repo/commit_statuses.tmpl | 4 | ||||
-rw-r--r-- | templates/repo/release/list.tmpl | 152 |
4 files changed, 168 insertions, 165 deletions
diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index fdb247d413..b920ffb6dd 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -12,6 +12,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" @@ -67,41 +68,16 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model return nil } -// Releases render releases list page -func Releases(ctx *context.Context) { - ctx.Data["PageIsReleaseList"] = true - ctx.Data["Title"] = ctx.Tr("repo.release.releases") - ctx.Data["IsViewBranch"] = false - ctx.Data["IsViewTag"] = true - // Disable the showCreateNewBranch form in the dropdown on this page. - ctx.Data["CanCreateBranch"] = false - ctx.Data["HideBranchesInDropdown"] = true - - listOptions := db.ListOptions{ - Page: ctx.FormInt("page"), - PageSize: ctx.FormInt("limit"), - } - if listOptions.PageSize == 0 { - listOptions.PageSize = setting.Repository.Release.DefaultPagingNum - } - if listOptions.PageSize > setting.API.MaxResponseItems { - listOptions.PageSize = setting.API.MaxResponseItems - } - - writeAccess := ctx.Repo.CanWrite(unit.TypeReleases) - ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived - - opts := repo_model.FindReleasesOptions{ - ListOptions: listOptions, - // only show draft releases for users who can write, read-only users shouldn't see draft releases. - IncludeDrafts: writeAccess, - RepoID: ctx.Repo.Repository.ID, - } +type ReleaseInfo struct { + Release *repo_model.Release + CommitStatus *git_model.CommitStatus + CommitStatuses []*git_model.CommitStatus +} +func getReleaseInfos(ctx *context.Context, opts *repo_model.FindReleasesOptions) ([]*ReleaseInfo, error) { releases, err := db.Find[repo_model.Release](ctx, opts) if err != nil { - ctx.ServerError("GetReleasesByRepoID", err) - return + return nil, err } for _, release := range releases { @@ -109,8 +85,7 @@ func Releases(ctx *context.Context) { } if err = repo_model.GetReleaseAttachments(ctx, releases...); err != nil { - ctx.ServerError("GetReleaseAttachments", err) - return + return nil, err } // Temporary cache commits count of used branches to speed up. @@ -121,6 +96,9 @@ func Releases(ctx *context.Context) { } var ok bool + canReadActions := ctx.Repo.CanRead(unit.TypeActions) + + releaseInfos := make([]*ReleaseInfo, 0, len(releases)) for _, r := range releases { if r.Publisher, ok = cacheUsers[r.PublisherID]; !ok { r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID) @@ -128,8 +106,7 @@ func Releases(ctx *context.Context) { if user_model.IsErrUserNotExist(err) { r.Publisher = user_model.NewGhostUser() } else { - ctx.ServerError("GetUserByID", err) - return + return nil, err } } cacheUsers[r.PublisherID] = r.Publisher @@ -144,24 +121,74 @@ func Releases(ctx *context.Context) { Ctx: ctx, }, r.Note) if err != nil { - ctx.ServerError("RenderString", err) - return + return nil, err } - if r.IsDraft { - continue + if !r.IsDraft { + if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { + return nil, err + } } - if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { - ctx.ServerError("calReleaseNumCommitsBehind", err) - return + info := &ReleaseInfo{ + Release: r, } + + if canReadActions { + statuses, _, err := git_model.GetLatestCommitStatus(ctx, r.Repo.ID, r.Sha1, db.ListOptions{ListAll: true}) + if err != nil { + return nil, err + } + + info.CommitStatus = git_model.CalcCommitStatus(statuses) + info.CommitStatuses = statuses + } + + releaseInfos = append(releaseInfos, info) + } + + return releaseInfos, nil +} + +// Releases render releases list page +func Releases(ctx *context.Context) { + ctx.Data["PageIsReleaseList"] = true + ctx.Data["Title"] = ctx.Tr("repo.release.releases") + ctx.Data["IsViewBranch"] = false + ctx.Data["IsViewTag"] = true + // Disable the showCreateNewBranch form in the dropdown on this page. + ctx.Data["CanCreateBranch"] = false + ctx.Data["HideBranchesInDropdown"] = true + + listOptions := db.ListOptions{ + Page: ctx.FormInt("page"), + PageSize: ctx.FormInt("limit"), + } + if listOptions.PageSize == 0 { + listOptions.PageSize = setting.Repository.Release.DefaultPagingNum + } + if listOptions.PageSize > setting.API.MaxResponseItems { + listOptions.PageSize = setting.API.MaxResponseItems + } + + writeAccess := ctx.Repo.CanWrite(unit.TypeReleases) + ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived + + releases, err := getReleaseInfos(ctx, &repo_model.FindReleasesOptions{ + ListOptions: listOptions, + // only show draft releases for users who can write, read-only users shouldn't see draft releases. + IncludeDrafts: writeAccess, + RepoID: ctx.Repo.Repository.ID, + }) + if err != nil { + ctx.ServerError("getReleaseInfos", err) + return } ctx.Data["Releases"] = releases numReleases := ctx.Data["NumReleases"].(int64) - pager := context.NewPagination(int(numReleases), opts.PageSize, opts.Page, 5) + pager := context.NewPagination(int(numReleases), listOptions.PageSize, listOptions.Page, 5) pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager @@ -249,15 +276,24 @@ func SingleRelease(ctx *context.Context) { writeAccess := ctx.Repo.CanWrite(unit.TypeReleases) ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived - release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*")) + releases, err := getReleaseInfos(ctx, &repo_model.FindReleasesOptions{ + ListOptions: db.ListOptions{Page: 1, PageSize: 1}, + RepoID: ctx.Repo.Repository.ID, + TagNames: []string{ctx.Params("*")}, + // only show draft releases for users who can write, read-only users shouldn't see draft releases. + IncludeDrafts: writeAccess, + }) if err != nil { - if repo_model.IsErrReleaseNotExist(err) { - ctx.NotFound("GetRelease", err) - return - } - ctx.ServerError("GetReleasesByRepoID", err) + ctx.ServerError("getReleaseInfos", err) + return + } + if len(releases) != 1 { + ctx.NotFound("SingleRelease", err) return } + + release := releases[0].Release + ctx.Data["PageIsSingleTag"] = release.IsTag if release.IsTag { ctx.Data["Title"] = release.TagName @@ -265,43 +301,7 @@ func SingleRelease(ctx *context.Context) { ctx.Data["Title"] = release.Title } - release.Repo = ctx.Repo.Repository - - err = repo_model.GetReleaseAttachments(ctx, release) - if err != nil { - ctx.ServerError("GetReleaseAttachments", err) - return - } - - release.Publisher, err = user_model.GetUserByID(ctx, release.PublisherID) - if err != nil { - if user_model.IsErrUserNotExist(err) { - release.Publisher = user_model.NewGhostUser() - } else { - ctx.ServerError("GetUserByID", err) - return - } - } - if !release.IsDraft { - if err := calReleaseNumCommitsBehind(ctx.Repo, release, make(map[string]int64)); err != nil { - ctx.ServerError("calReleaseNumCommitsBehind", err) - return - } - } - release.Note, err = markdown.RenderString(&markup.RenderContext{ - Links: markup.Links{ - Base: ctx.Repo.RepoLink, - }, - Metas: ctx.Repo.Repository.ComposeMetas(ctx), - GitRepo: ctx.Repo.GitRepo, - Ctx: ctx, - }, release.Note) - if err != nil { - ctx.ServerError("RenderString", err) - return - } - - ctx.Data["Releases"] = []*repo_model.Release{release} + ctx.Data["Releases"] = releases ctx.HTML(http.StatusOK, tplReleasesList) } diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index 72a3ab7ac6..edd1fd1568 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -64,6 +64,9 @@ func createCommitStatus(ctx context.Context, job *actions_model.ActionRunJob) er return fmt.Errorf("head of pull request is missing in event payload") } sha = payload.PullRequest.Head.Sha + case webhook_module.HookEventRelease: + event = string(run.Event) + sha = run.CommitSHA default: return nil } diff --git a/templates/repo/commit_statuses.tmpl b/templates/repo/commit_statuses.tmpl index ec2be6c38d..74c20a6a2c 100644 --- a/templates/repo/commit_statuses.tmpl +++ b/templates/repo/commit_statuses.tmpl @@ -1,10 +1,10 @@ {{if .Statuses}} {{if and (eq (len .Statuses) 1) .Status.TargetURL}} - <a class="gt-vm gt-no-underline" data-tippy="commit-statuses" href="{{.Status.TargetURL}}"> + <a class="gt-vm {{.AdditionalClasses}} gt-no-underline" data-tippy="commit-statuses" href="{{.Status.TargetURL}}"> {{template "repo/commit_status" .Status}} </a> {{else}} - <span class="gt-vm" data-tippy="commit-statuses" tabindex="0"> + <span class="gt-vm {{.AdditionalClasses}}" data-tippy="commit-statuses" tabindex="0"> {{template "repo/commit_status" .Status}} </span> {{end}} diff --git a/templates/repo/release/list.tmpl b/templates/repo/release/list.tmpl index fb2fce2950..6dbeb741db 100644 --- a/templates/repo/release/list.tmpl +++ b/templates/repo/release/list.tmpl @@ -5,90 +5,90 @@ {{template "base/alert" .}} {{template "repo/release_tag_header" .}} <ul id="release-list"> - {{range $idx, $release := .Releases}} + {{range $idx, $info := .Releases}} + {{$release := $info.Release}} <li class="ui grid"> <div class="ui four wide column meta"> - <a class="muted" href="{{if not (and .Sha1 ($.Permission.CanRead $.UnitTypeCode))}}#{{else}}{{$.RepoLink}}/src/tag/{{.TagName | PathEscapeSegments}}{{end}}" rel="nofollow">{{svg "octicon-tag" 16 "gt-mr-2"}}{{.TagName}}</a> - {{if and .Sha1 ($.Permission.CanRead $.UnitTypeCode)}} - <a class="muted gt-mono" href="{{$.RepoLink}}/src/commit/{{.Sha1}}" rel="nofollow">{{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Sha1}}</a> - {{template "repo/branch_dropdown" dict "root" $ "release" .}} - {{end}} + <a class="muted" href="{{if not (and $release.Sha1 ($.Permission.CanRead $.UnitTypeCode))}}#{{else}}{{$.RepoLink}}/src/tag/{{$release.TagName | PathEscapeSegments}}{{end}}" rel="nofollow">{{svg "octicon-tag" 16 "gt-mr-2"}}{{$release.TagName}}</a> + {{if and $release.Sha1 ($.Permission.CanRead $.UnitTypeCode)}} + <a class="muted gt-mono" href="{{$.RepoLink}}/src/commit/{{$release.Sha1}}" rel="nofollow">{{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha $release.Sha1}}</a> + {{template "repo/branch_dropdown" dict "root" $ "release" $release}} + {{end}} </div> <div class="ui twelve wide column detail"> - <div class="gt-df gt-ac gt-sb gt-fw gt-mb-3"> - <h4 class="release-list-title gt-word-break"> - <a href="{{$.RepoLink}}/releases/tag/{{.TagName | PathEscapeSegments}}">{{.Title}}</a> - {{if .IsDraft}} - <span class="ui yellow label">{{ctx.Locale.Tr "repo.release.draft"}}</span> - {{else if .IsPrerelease}} - <span class="ui orange label">{{ctx.Locale.Tr "repo.release.prerelease"}}</span> - {{else}} - <span class="ui green label">{{ctx.Locale.Tr "repo.release.stable"}}</span> - {{end}} - </h4> - <div> - {{if $.CanCreateRelease}} - <a class="muted" data-tooltip-content="{{ctx.Locale.Tr "repo.release.edit"}}" href="{{$.RepoLink}}/releases/edit/{{.TagName | PathEscapeSegments}}" rel="nofollow"> - {{svg "octicon-pencil"}} - </a> - {{end}} - </div> - </div> - <p class="text grey"> - <span class="author"> - {{if .OriginalAuthor}} - {{svg (MigrationIcon .Repo.GetOriginalURLHostname) 20 "gt-mr-2"}}{{.OriginalAuthor}} - {{else if .Publisher}} - {{ctx.AvatarUtils.Avatar .Publisher 20 "gt-mr-2"}} - <a href="{{.Publisher.HomeLink}}">{{.Publisher.GetDisplayName}}</a> + <div class="gt-df gt-ac gt-sb gt-fw gt-mb-3"> + <h4 class="release-list-title gt-word-break"> + <a href="{{$.RepoLink}}/releases/tag/{{$release.TagName | PathEscapeSegments}}">{{$release.Title}}</a> + {{template "repo/commit_statuses" dict "Status" $info.CommitStatus "Statuses" $info.CommitStatuses "AdditionalClasses" "gt-df"}} + {{if $release.IsDraft}} + <span class="ui yellow label">{{ctx.Locale.Tr "repo.release.draft"}}</span> + {{else if $release.IsPrerelease}} + <span class="ui orange label">{{ctx.Locale.Tr "repo.release.prerelease"}}</span> {{else}} - Ghost + <span class="ui green label">{{ctx.Locale.Tr "repo.release.stable"}}</span> {{end}} - </span> - <span class="released"> - {{ctx.Locale.Tr "repo.released_this"}} - </span> - {{if .CreatedUnix}} - <span class="time">{{TimeSinceUnix .CreatedUnix ctx.Locale}}</span> + </h4> + <div> + {{if $.CanCreateRelease}} + <a class="muted" data-tooltip-content="{{ctx.Locale.Tr "repo.release.edit"}}" href="{{$.RepoLink}}/releases/edit/{{$release.TagName | PathEscapeSegments}}" rel="nofollow"> + {{svg "octicon-pencil"}} + </a> {{end}} - {{if and (not .IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} - | <span class="ahead"><a href="{{$.RepoLink}}/compare/{{.TagName | PathEscapeSegments}}...{{.TargetBehind | PathEscapeSegments}}">{{ctx.Locale.Tr "repo.release.ahead.commits" .NumCommitsBehind | Str2html}}</a> {{ctx.Locale.Tr "repo.release.ahead.target" .TargetBehind}}</span> - {{end}} - </p> - <div class="markup desc"> - {{Str2html .Note}} </div> - <div class="divider"></div> - <details class="download" {{if eq $idx 0}}open{{end}}> - <summary class="gt-my-4"> - {{ctx.Locale.Tr "repo.release.downloads"}} - </summary> - <ul class="list"> - {{if and (not $.DisableDownloadSourceArchives) (not .IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} - <li> - <a class="archive-link" href="{{$.RepoLink}}/archive/{{.TagName | PathEscapeSegments}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "gt-mr-2"}}{{ctx.Locale.Tr "repo.release.source_code"}} (ZIP)</strong></a> - </li> - <li> - <a class="archive-link" href="{{$.RepoLink}}/archive/{{.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "gt-mr-2"}}{{ctx.Locale.Tr "repo.release.source_code"}} (TAR.GZ)</strong></a> - </li> - {{end}} - {{if .Attachments}} - {{range .Attachments}} - <li> - <a target="_blank" rel="nofollow" href="{{.DownloadURL}}" download> - <strong>{{svg "octicon-package" 16 "gt-mr-2"}}{{.Name}}</strong> - </a> - <div> - <span class="text grey">{{.Size | FileSize}}</span> - <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.download_count" (ctx.Locale.PrettyNumber .DownloadCount)}}"> - {{svg "octicon-info"}} - </span> - </div> - </li> - {{end}} - {{end}} - </ul> - </details> + </div> + <p class="text grey"> + <span class="author"> + {{if $release.OriginalAuthor}} + {{svg (MigrationIcon $release.Repo.GetOriginalURLHostname) 20 "gt-mr-2"}}{{$release.OriginalAuthor}} + {{else if $release.Publisher}} + {{ctx.AvatarUtils.Avatar $release.Publisher 20 "gt-mr-2"}} + <a href="{{$release.Publisher.HomeLink}}">{{$release.Publisher.GetDisplayName}}</a> + {{else}} + Ghost + {{end}} + </span> + <span class="released"> + {{ctx.Locale.Tr "repo.released_this"}} + </span> + {{if $release.CreatedUnix}} + <span class="time">{{TimeSinceUnix $release.CreatedUnix ctx.Locale}}</span> + {{end}} + {{if and (not $release.IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} + | <span class="ahead"><a href="{{$.RepoLink}}/compare/{{$release.TagName | PathEscapeSegments}}...{{$release.TargetBehind | PathEscapeSegments}}">{{ctx.Locale.Tr "repo.release.ahead.commits" $release.NumCommitsBehind | Str2html}}</a> {{ctx.Locale.Tr "repo.release.ahead.target" $release.TargetBehind}}</span> + {{end}} + </p> + <div class="markup desc"> + {{Str2html $release.Note}} + </div> + <div class="divider"></div> + <details class="download" {{if eq $idx 0}}open{{end}}> + <summary class="gt-my-4"> + {{ctx.Locale.Tr "repo.release.downloads"}} + </summary> + <ul class="list"> + {{if and (not $.DisableDownloadSourceArchives) (not $release.IsDraft) ($.Permission.CanRead $.UnitTypeCode)}} + <li> + <a class="archive-link" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.zip" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "gt-mr-2"}}{{ctx.Locale.Tr "repo.release.source_code"}} (ZIP)</strong></a> + </li> + <li> + <a class="archive-link" href="{{$.RepoLink}}/archive/{{$release.TagName | PathEscapeSegments}}.tar.gz" rel="nofollow"><strong>{{svg "octicon-file-zip" 16 "gt-mr-2"}}{{ctx.Locale.Tr "repo.release.source_code"}} (TAR.GZ)</strong></a> + </li> + {{end}} + {{range $release.Attachments}} + <li> + <a target="_blank" rel="nofollow" href="{{.DownloadURL}}" download> + <strong>{{svg "octicon-package" 16 "gt-mr-2"}}{{.Name}}</strong> + </a> + <div> + <span class="text grey">{{.Size | FileSize}}</span> + <span data-tooltip-content="{{ctx.Locale.Tr "repo.release.download_count" (ctx.Locale.PrettyNumber .DownloadCount)}}"> + {{svg "octicon-info"}} + </span> + </div> + </li> + {{end}} + </ul> + </details> <div class="dot"></div> </div> </li> |