|
|
|
|
@ -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)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|