Skip to content

Commit 61306fa

Browse files
authored
Make releases faster than before and resolved #490 (#588)
* make releases faster than before and resolved #490 * fix comment
1 parent 79d5271 commit 61306fa

File tree

6 files changed

+169
-64
lines changed

6 files changed

+169
-64
lines changed

models/release.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import (
2222

2323
// Release represents a release of repository.
2424
type Release struct {
25-
ID int64 `xorm:"pk autoincr"`
26-
RepoID int64
25+
ID int64 `xorm:"pk autoincr"`
26+
RepoID int64 `xorm:"index unique(n)"`
2727
Repo *Repository `xorm:"-"`
2828
PublisherID int64
29-
Publisher *User `xorm:"-"`
30-
TagName string
29+
Publisher *User `xorm:"-"`
30+
TagName string `xorm:"index unique(n)"`
3131
LowerTagName string
3232
Target string
3333
Title string
@@ -213,6 +213,15 @@ func GetReleasesByRepoID(repoID int64, page, pageSize int) (rels []*Release, err
213213
return rels, err
214214
}
215215

216+
// GetReleasesByRepoIDAndNames returns a list of releases of repository accroding repoID and tagNames.
217+
func GetReleasesByRepoIDAndNames(repoID int64, tagNames []string) (rels []*Release, err error) {
218+
err = x.
219+
Desc("created_unix").
220+
In("tag_name", tagNames).
221+
Find(&rels, Release{RepoID: repoID})
222+
return rels, err
223+
}
224+
216225
type releaseSorter struct {
217226
rels []*Release
218227
}

routers/repo/release.go

+46-56
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
package repo
66

77
import (
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

vendor/code.gitea.io/git/MAINTAINERS

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/code.gitea.io/git/repo_tag.go

+82
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/code.gitea.io/git/tag.go

+24-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/vendor.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"ignore": "test",
44
"package": [
55
{
6-
"checksumSHA1": "mIaKLz6373W+jDLjgE/Yzt/exeo=",
6+
"checksumSHA1": "zK/6EifSPy/O5Vbx7CMWfnLHExI=",
77
"path": "code.gitea.io/git",
8-
"revision": "3d0fa331865619d2f3a7a0fcf23670a389310954",
9-
"revisionTime": "2016-12-28T14:57:51Z"
8+
"revision": "a3ee12b97af51eec1b7aa0525f6a39c97520817d",
9+
"revisionTime": "2017-01-05T02:48:44Z"
1010
},
1111
{
1212
"checksumSHA1": "BKj0haFTDebzdC2nACpoGzp3s8A=",

0 commit comments

Comments
 (0)