5
5
package repo
6
6
7
7
import (
8
+ "errors"
8
9
"fmt"
9
10
11
+ "code.gitea.io/git"
10
12
"code.gitea.io/gitea/models"
11
13
"code.gitea.io/gitea/modules/auth"
12
14
"code.gitea.io/gitea/modules/base"
@@ -54,34 +56,55 @@ func Releases(ctx *context.Context) {
54
56
ctx .Data ["Title" ] = ctx .Tr ("repo.release.releases" )
55
57
ctx .Data ["PageIsReleaseList" ] = true
56
58
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 {})
58
69
if err != nil {
59
70
ctx .Handle (500 , "GetTags" , err )
60
71
return
61
72
}
62
73
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 )
66
89
}
67
- releases , err := models .GetReleasesByRepoID (ctx .Repo .Repository .ID , page , 10 )
90
+
91
+ releases , err := models .GetReleasesByRepoIDAndNames (ctx .Repo .Repository .ID , tagNames )
68
92
if err != nil {
69
- ctx .Handle (500 , "GetReleasesByRepoID " , err )
93
+ ctx .Handle (500 , "GetReleasesByRepoIDAndNames " , err )
70
94
return
71
95
}
72
96
73
97
// Temproray cache commits count of used branches to speed up.
74
98
countCache := make (map [string ]int64 )
75
-
76
99
var cacheUsers = make (map [int64 ]* models.User )
77
100
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 () {
82
105
continue
83
106
}
84
- if r .TagName == rawTag {
107
+ if r .TagName == rawTag . Name {
85
108
if r .Publisher , ok = cacheUsers [r .PublisherID ]; ! ok {
86
109
r .Publisher , err = models .GetUserByID (r .PublisherID )
87
110
if err != nil {
@@ -101,64 +124,31 @@ func Releases(ctx *context.Context) {
101
124
}
102
125
103
126
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
106
128
break
107
129
}
108
130
}
109
131
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 ,
121
138
}
122
139
123
- tags [i ].NumCommits , err = commit .CommitsCount ()
140
+ releaseTags [i ].NumCommits , err = git .CommitsCount (ctx . Repo . GitRepo . Path , rawTag . Object . String () )
124
141
if err != nil {
125
142
ctx .Handle (500 , "CommitsCount" , err )
126
143
return
127
144
}
128
- tags [i ].NumCommitsBehind = ctx .Repo .CommitsCount - tags [i ].NumCommits
145
+ releaseTags [i ].NumCommitsBehind = ctx .Repo .CommitsCount - releaseTags [i ].NumCommits
129
146
}
130
147
}
131
148
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 )
159
150
ctx .Data ["Page" ] = pager
160
- models .SortReleases (tags )
161
- ctx .Data ["Releases" ] = tags
151
+ ctx .Data ["Releases" ] = releaseTags
162
152
ctx .HTML (200 , tplReleases )
163
153
}
164
154
0 commit comments