55package repo
66
77import (
8+ "errors"
89 "fmt"
910
11+ "code.gitea.io/git"
1012 "code.gitea.io/gitea/models"
1113 "code.gitea.io/gitea/modules/auth"
1214 "code.gitea.io/gitea/modules/base"
@@ -54,34 +56,55 @@ func Releases(ctx *context.Context) {
5456 ctx .Data ["Title" ] = ctx .Tr ("repo.release.releases" )
5557 ctx .Data ["PageIsReleaseList" ] = true
5658
57- rawTags , err := ctx .Repo .GitRepo .GetTags ()
59+ page := ctx .QueryInt ("page" )
60+ if page <= 1 {
61+ page = 1
62+ }
63+ limit := ctx .QueryInt ("limit" )
64+ if limit <= 0 {
65+ limit = 10
66+ }
67+
68+ rawTags , err := ctx .Repo .GitRepo .GetTagInfos (git.TagOption {})
5869 if err != nil {
5970 ctx .Handle (500 , "GetTags" , err )
6071 return
6172 }
6273
63- page := ctx .QueryInt ("page" )
64- if page <= 1 {
65- page = 1
74+ if len (rawTags ) <= (page - 1 )* limit {
75+ ctx .Handle (500 , "Releases" , errors .New ("no more pages" ))
76+ return
77+ }
78+
79+ var tags []* git.Tag
80+ if page * limit > len (rawTags ) {
81+ tags = rawTags [(page - 1 )* limit :]
82+ } else {
83+ tags = rawTags [(page - 1 )* limit : page * limit ]
84+ }
85+
86+ var tagNames []string
87+ for _ , t := range tags {
88+ tagNames = append (tagNames , t .Name )
6689 }
67- releases , err := models .GetReleasesByRepoID (ctx .Repo .Repository .ID , page , 10 )
90+
91+ releases , err := models .GetReleasesByRepoIDAndNames (ctx .Repo .Repository .ID , tagNames )
6892 if err != nil {
69- ctx .Handle (500 , "GetReleasesByRepoID " , err )
93+ ctx .Handle (500 , "GetReleasesByRepoIDAndNames " , err )
7094 return
7195 }
7296
7397 // Temproray cache commits count of used branches to speed up.
7498 countCache := make (map [string ]int64 )
75-
7699 var cacheUsers = make (map [int64 ]* models.User )
77100 var ok bool
78- tags := make ([]* models.Release , len (rawTags ))
79- for i , rawTag := range rawTags {
80- for j , r := range releases {
81- if r == nil || ( r .IsDraft && ! ctx .Repo .IsOwner () ) {
101+ releaseTags := make ([]* models.Release , len (tags ))
102+ for i , rawTag := range tags {
103+ for _ , r := range releases {
104+ if r .IsDraft && ! ctx .Repo .IsOwner () {
82105 continue
83106 }
84- if r .TagName == rawTag {
107+ if r .TagName == rawTag . Name {
85108 if r .Publisher , ok = cacheUsers [r .PublisherID ]; ! ok {
86109 r .Publisher , err = models .GetUserByID (r .PublisherID )
87110 if err != nil {
@@ -101,64 +124,31 @@ func Releases(ctx *context.Context) {
101124 }
102125
103126 r .Note = markdown .RenderString (r .Note , ctx .Repo .RepoLink , ctx .Repo .Repository .ComposeMetas ())
104- tags [i ] = r
105- releases [j ] = nil // Mark as used.
127+ releaseTags [i ] = r
106128 break
107129 }
108130 }
109131
110- if tags [i ] == nil {
111- commit , err := ctx .Repo .GitRepo .GetTagCommit (rawTag )
112- if err != nil {
113- ctx .Handle (500 , "GetTagCommit" , err )
114- return
115- }
116-
117- tags [i ] = & models.Release {
118- Title : rawTag ,
119- TagName : rawTag ,
120- Sha1 : commit .ID .String (),
132+ if releaseTags [i ] == nil {
133+ releaseTags [i ] = & models.Release {
134+ Title : rawTag .Name ,
135+ TagName : rawTag .Name ,
136+ Sha1 : rawTag .Object .String (),
137+ Note : rawTag .Message ,
121138 }
122139
123- tags [i ].NumCommits , err = commit .CommitsCount ()
140+ releaseTags [i ].NumCommits , err = git .CommitsCount (ctx . Repo . GitRepo . Path , rawTag . Object . String () )
124141 if err != nil {
125142 ctx .Handle (500 , "CommitsCount" , err )
126143 return
127144 }
128- tags [i ].NumCommitsBehind = ctx .Repo .CommitsCount - tags [i ].NumCommits
145+ releaseTags [i ].NumCommitsBehind = ctx .Repo .CommitsCount - releaseTags [i ].NumCommits
129146 }
130147 }
131148
132- for _ , r := range releases {
133- if r == nil {
134- continue
135- }
136-
137- if r .Publisher , ok = cacheUsers [r .PublisherID ]; ! ok {
138- r .Publisher , err = models .GetUserByID (r .PublisherID )
139- if err != nil {
140- if models .IsErrUserNotExist (err ) {
141- r .Publisher = models .NewGhostUser ()
142- } else {
143- ctx .Handle (500 , "GetUserByID" , err )
144- return
145- }
146- }
147- cacheUsers [r .PublisherID ] = r .Publisher
148- }
149-
150- if err := calReleaseNumCommitsBehind (ctx .Repo , r , countCache ); err != nil {
151- ctx .Handle (500 , "calReleaseNumCommitsBehind" , err )
152- return
153- }
154-
155- r .Note = markdown .RenderString (r .Note , ctx .Repo .RepoLink , ctx .Repo .Repository .ComposeMetas ())
156- tags = append (tags , r )
157- }
158- pager := paginater .New (ctx .Repo .Repository .NumTags , 10 , page , 5 )
149+ pager := paginater .New (ctx .Repo .Repository .NumTags , limit , page , 5 )
159150 ctx .Data ["Page" ] = pager
160- models .SortReleases (tags )
161- ctx .Data ["Releases" ] = tags
151+ ctx .Data ["Releases" ] = releaseTags
162152 ctx .HTML (200 , tplReleases )
163153}
164154
0 commit comments