Skip to content

Commit 3fcad58

Browse files
authored
Improvements of releases list and tags list (#25859)
Follow #23465 and #25624 This PR introduces the following improvements: - We do not need to call `GetTags` to get tags because tags have been loaded by `RepoAssignment` https://github.com/go-gitea/gitea/blob/ef90fdbd1d7e1f62ed5bf18757e00e97817eb602/modules/context/repo.go#L663-L668 - Similarly, the number of tags and releases also have been loaded by `RepoAssignment`, so the related code has been removed from the handlers. The query condition of `GetReleaseCountByRepoID` in `RepoAssignment` has been changed to include draft releases. https://github.com/go-gitea/gitea/blob/ef90fdbd1d7e1f62ed5bf18757e00e97817eb602/modules/context/repo.go#L538-L551 - `releasesOrTags` function has been removed. The code for rendering releases list and tags list moved to `Releases` and `TagList` respectively.
1 parent 1c039b4 commit 3fcad58

File tree

3 files changed

+67
-51
lines changed

3 files changed

+67
-51
lines changed

modules/context/repo.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,10 @@ func RepoAssignment(ctx *Context) context.CancelFunc {
545545
ctx.ServerError("GetReleaseCountByRepoID", err)
546546
return nil
547547
}
548-
ctx.Data["NumReleases"], err = repo_model.GetReleaseCountByRepoID(ctx, ctx.Repo.Repository.ID, repo_model.FindReleasesOptions{})
548+
ctx.Data["NumReleases"], err = repo_model.GetReleaseCountByRepoID(ctx, ctx.Repo.Repository.ID, repo_model.FindReleasesOptions{
549+
// only show draft releases for users who can write, read-only users shouldn't see draft releases.
550+
IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases),
551+
})
549552
if err != nil {
550553
ctx.ServerError("GetReleaseCountByRepoID", err)
551554
return nil

routers/web/repo/release.go

+50-47
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,6 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model
7171
func Releases(ctx *context.Context) {
7272
ctx.Data["PageIsReleaseList"] = true
7373
ctx.Data["Title"] = ctx.Tr("repo.release.releases")
74-
releasesOrTags(ctx, false)
75-
}
76-
77-
// TagsList render tags list page
78-
func TagsList(ctx *context.Context) {
79-
ctx.Data["PageIsTagList"] = true
80-
ctx.Data["Title"] = ctx.Tr("repo.release.tags")
81-
releasesOrTags(ctx, true)
82-
}
83-
84-
func releasesOrTags(ctx *context.Context, isTagList bool) {
85-
ctx.Data["DefaultBranch"] = ctx.Repo.Repository.DefaultBranch
8674
ctx.Data["IsViewBranch"] = false
8775
ctx.Data["IsViewTag"] = true
8876
// Disable the showCreateNewBranch form in the dropdown on this page.
@@ -100,35 +88,13 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
10088
listOptions.PageSize = setting.API.MaxResponseItems
10189
}
10290

103-
// TODO(20073) tags are used for compare feature which needs all tags
104-
// filtering is done on the client-side atm
105-
tagListStart, tagListEnd := 0, 0
106-
if isTagList {
107-
tagListStart, tagListEnd = listOptions.GetStartEnd()
108-
}
109-
110-
tags, err := ctx.Repo.GitRepo.GetTags(tagListStart, tagListEnd)
111-
if err != nil {
112-
ctx.ServerError("GetTags", err)
113-
return
114-
}
115-
ctx.Data["Tags"] = tags
116-
11791
writeAccess := ctx.Repo.CanWrite(unit.TypeReleases)
11892
ctx.Data["CanCreateRelease"] = writeAccess && !ctx.Repo.Repository.IsArchived
11993

12094
opts := repo_model.FindReleasesOptions{
12195
ListOptions: listOptions,
122-
}
123-
if isTagList {
124-
// for the tags list page, show all releases with real tags (having real commit-id),
125-
// the drafts should also be included because a real tag might be used as a draft.
126-
opts.IncludeDrafts = true
127-
opts.IncludeTags = true
128-
opts.HasSha1 = util.OptionalBoolTrue
129-
} else {
13096
// only show draft releases for users who can write, read-only users shouldn't see draft releases.
131-
opts.IncludeDrafts = writeAccess
97+
IncludeDrafts: writeAccess,
13298
}
13399

134100
releases, err := repo_model.GetReleasesByRepoID(ctx, ctx.Repo.Repository.ID, opts)
@@ -137,12 +103,6 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
137103
return
138104
}
139105

140-
count, err := repo_model.GetReleaseCountByRepoID(ctx, ctx.Repo.Repository.ID, opts)
141-
if err != nil {
142-
ctx.ServerError("GetReleaseCountByRepoID", err)
143-
return
144-
}
145-
146106
for _, release := range releases {
147107
release.Repo = ctx.Repo.Repository
148108
}
@@ -197,16 +157,59 @@ func releasesOrTags(ctx *context.Context, isTagList bool) {
197157

198158
ctx.Data["Releases"] = releases
199159

200-
pager := context.NewPagination(int(count), opts.PageSize, opts.Page, 5)
160+
numReleases := ctx.Data["NumReleases"].(int64)
161+
pager := context.NewPagination(int(numReleases), opts.PageSize, opts.Page, 5)
201162
pager.SetDefaultParams(ctx)
202163
ctx.Data["Page"] = pager
203164

204-
if isTagList {
205-
ctx.Data["PageIsViewCode"] = !ctx.Repo.Repository.UnitEnabled(ctx, unit.TypeReleases)
206-
ctx.HTML(http.StatusOK, tplTagsList)
207-
} else {
208-
ctx.HTML(http.StatusOK, tplReleasesList)
165+
ctx.HTML(http.StatusOK, tplReleasesList)
166+
}
167+
168+
// TagsList render tags list page
169+
func TagsList(ctx *context.Context) {
170+
ctx.Data["PageIsTagList"] = true
171+
ctx.Data["Title"] = ctx.Tr("repo.release.tags")
172+
ctx.Data["IsViewBranch"] = false
173+
ctx.Data["IsViewTag"] = true
174+
// Disable the showCreateNewBranch form in the dropdown on this page.
175+
ctx.Data["CanCreateBranch"] = false
176+
ctx.Data["HideBranchesInDropdown"] = true
177+
178+
listOptions := db.ListOptions{
179+
Page: ctx.FormInt("page"),
180+
PageSize: ctx.FormInt("limit"),
181+
}
182+
if listOptions.PageSize == 0 {
183+
listOptions.PageSize = setting.Repository.Release.DefaultPagingNum
184+
}
185+
if listOptions.PageSize > setting.API.MaxResponseItems {
186+
listOptions.PageSize = setting.API.MaxResponseItems
187+
}
188+
189+
opts := repo_model.FindReleasesOptions{
190+
ListOptions: listOptions,
191+
// for the tags list page, show all releases with real tags (having real commit-id),
192+
// the drafts should also be included because a real tag might be used as a draft.
193+
IncludeDrafts: true,
194+
IncludeTags: true,
195+
HasSha1: util.OptionalBoolTrue,
196+
}
197+
198+
releases, err := repo_model.GetReleasesByRepoID(ctx, ctx.Repo.Repository.ID, opts)
199+
if err != nil {
200+
ctx.ServerError("GetReleasesByRepoID", err)
201+
return
209202
}
203+
204+
ctx.Data["Releases"] = releases
205+
206+
numTags := ctx.Data["NumTags"].(int64)
207+
pager := context.NewPagination(int(numTags), opts.PageSize, opts.Page, 5)
208+
pager.SetDefaultParams(ctx)
209+
ctx.Data["Page"] = pager
210+
211+
ctx.Data["PageIsViewCode"] = !ctx.Repo.Repository.UnitEnabled(ctx, unit.TypeReleases)
212+
ctx.HTML(http.StatusOK, tplTagsList)
210213
}
211214

212215
// ReleasesFeedRSS get feeds for releases in RSS format

routers/web/repo/release_test.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
repo_model "code.gitea.io/gitea/models/repo"
10+
"code.gitea.io/gitea/models/unit"
1011
"code.gitea.io/gitea/models/unittest"
1112
"code.gitea.io/gitea/modules/contexttest"
1213
"code.gitea.io/gitea/modules/web"
@@ -65,16 +66,25 @@ func TestNewReleasePost(t *testing.T) {
6566
}
6667
}
6768

68-
func TestNewReleasesList(t *testing.T) {
69+
func TestCalReleaseNumCommitsBehind(t *testing.T) {
6970
unittest.PrepareTestEnv(t)
7071
ctx, _ := contexttest.MockContext(t, "user2/repo-release/releases")
7172
contexttest.LoadUser(t, ctx, 2)
7273
contexttest.LoadRepo(t, ctx, 57)
7374
contexttest.LoadGitRepo(t, ctx)
7475
t.Cleanup(func() { ctx.Repo.GitRepo.Close() })
7576

76-
Releases(ctx)
77-
releases := ctx.Data["Releases"].([]*repo_model.Release)
77+
releases, err := repo_model.GetReleasesByRepoID(ctx, ctx.Repo.Repository.ID, repo_model.FindReleasesOptions{
78+
IncludeDrafts: ctx.Repo.CanWrite(unit.TypeReleases),
79+
})
80+
assert.NoError(t, err)
81+
82+
countCache := make(map[string]int64)
83+
for _, release := range releases {
84+
err := calReleaseNumCommitsBehind(ctx.Repo, release, countCache)
85+
assert.NoError(t, err)
86+
}
87+
7888
type computedFields struct {
7989
NumCommitsBehind int64
8090
TargetBehind string

0 commit comments

Comments
 (0)