diff options
author | Unknwon <u@gogs.io> | 2017-03-10 14:12:46 -0500 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-03-10 14:12:46 -0500 |
commit | 451aef7a1c177b58c4519239a65dbfbab32b4888 (patch) | |
tree | c1bcd9b767c23843733005a7794531c82039dbee /routers/repo | |
parent | 22882d7c04b13979f5cf50f93b4fccbc36df342d (diff) |
release: improve page load performance
Previously, we load all releases of a repository which could hurt
performance when the repository has a lot of releases.
Now we're able to only load releases in current page view we need
to show by matching with 'tag_name'.
Diffstat (limited to 'routers/repo')
-rw-r--r-- | routers/repo/release.go | 78 |
1 files changed, 44 insertions, 34 deletions
diff --git a/routers/repo/release.go b/routers/repo/release.go index 7d35b318..09473242 100644 --- a/routers/repo/release.go +++ b/routers/repo/release.go @@ -59,35 +59,26 @@ func Releases(ctx *context.Context) { return } - // FIXME: should only get releases match tags result and drafts. - releases, err := models.GetReleasesByRepoID(ctx.Repo.Repository.ID) + releases, err := models.GetPublishedReleasesByRepoID(ctx.Repo.Repository.ID, tagsResult.Tags...) if err != nil { - ctx.Handle(500, "GetReleasesByRepoID", err) + ctx.Handle(500, "GetPublishedReleasesByRepoID", err) return } // Temproray cache commits count of used branches to speed up. countCache := make(map[string]int64) - drafts := make([]*models.Release, 0, 1) - tags := make([]*models.Release, len(tagsResult.Tags)) + results := make([]*models.Release, len(tagsResult.Tags)) for i, rawTag := range tagsResult.Tags { for j, r := range releases { - if r == nil || - (r.IsDraft && !ctx.Repo.IsOwner()) || - (!r.IsDraft && r.TagName != rawTag) { + if r == nil || r.TagName != rawTag { continue } releases[j] = nil // Mark as used. - r.Publisher, err = models.GetUserByID(r.PublisherID) - if err != nil { - if models.IsErrUserNotExist(err) { - r.Publisher = models.NewGhostUser() - } else { - ctx.Handle(500, "GetUserByID", err) - return - } + if err = r.LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", err) + return } if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { @@ -96,49 +87,68 @@ func Releases(ctx *context.Context) { } r.Note = markdown.RenderString(r.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas()) - if r.TagName == rawTag { - tags[i] = r - break - } - - if r.IsDraft { - drafts = append(drafts, r) - } + results[i] = r + break } - if tags[i] == nil { + // No published release matches this tag + if results[i] == nil { commit, err := ctx.Repo.GitRepo.GetTagCommit(rawTag) if err != nil { ctx.Handle(500, "GetTagCommit", err) return } - tags[i] = &models.Release{ + results[i] = &models.Release{ Title: rawTag, TagName: rawTag, Sha1: commit.ID.String(), } - tags[i].NumCommits, err = commit.CommitsCount() + results[i].NumCommits, err = commit.CommitsCount() if err != nil { ctx.Handle(500, "CommitsCount", err) return } - tags[i].NumCommitsBehind = ctx.Repo.CommitsCount - tags[i].NumCommits + results[i].NumCommitsBehind = ctx.Repo.CommitsCount - results[i].NumCommits } } + models.SortReleases(results) + + // Only show drafts if user is viewing the latest page + var drafts []*models.Release + if tagsResult.HasLatest { + drafts, err = models.GetDraftReleasesByRepoID(ctx.Repo.Repository.ID) + if err != nil { + ctx.Handle(500, "GetDraftReleasesByRepoID", err) + return + } + + for _, r := range drafts { + if err = r.LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", err) + return + } - models.SortReleases(tags) - if len(drafts) > 0 && tagsResult.HasLatest { - tags = append(drafts, tags...) + if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { + ctx.Handle(500, "calReleaseNumCommitsBehind", err) + return + } + + r.Note = markdown.RenderString(r.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas()) + } + + if len(drafts) > 0 { + results = append(drafts, results...) + } } - ctx.Data["Releases"] = tags + ctx.Data["Releases"] = results ctx.Data["HasPrevious"] = !tagsResult.HasLatest ctx.Data["ReachEnd"] = tagsResult.ReachEnd ctx.Data["PreviousAfter"] = tagsResult.PreviousAfter - if len(tags) > 0 { - ctx.Data["NextAfter"] = tags[len(tags)-1].TagName + if len(results) > 0 { + ctx.Data["NextAfter"] = results[len(results)-1].TagName } ctx.HTML(200, RELEASES) } |