Skip to content

Commit b2ba574

Browse files
committed
improve GetIssuesLatestCommitStatuses
1 parent bc4470a commit b2ba574

File tree

4 files changed

+70
-152
lines changed

4 files changed

+70
-152
lines changed

models/pull.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,12 @@ type PullRequest struct {
6969
BaseBranch string
7070
ProtectedBranch *ProtectedBranch `xorm:"-"`
7171
MergeBase string `xorm:"VARCHAR(40)"`
72-
73-
HasMerged bool `xorm:"INDEX"`
74-
MergedCommitID string `xorm:"VARCHAR(40)"`
75-
MergerID int64 `xorm:"INDEX"`
76-
Merger *User `xorm:"-"`
77-
MergedUnix util.TimeStamp `xorm:"updated INDEX"`
72+
LastCommitID string `xorm:"-"`
73+
HasMerged bool `xorm:"INDEX"`
74+
MergedCommitID string `xorm:"VARCHAR(40)"`
75+
MergerID int64 `xorm:"INDEX"`
76+
Merger *User `xorm:"-"`
77+
MergedUnix util.TimeStamp `xorm:"updated INDEX"`
7878
}
7979

8080
// Note: don't try to get Issue because will end up recursive querying.

models/status.go

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -158,21 +158,42 @@ func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitSta
158158
return statuses, x.In("id", ids).Find(&statuses)
159159
}
160160

161-
// GetLatestCommitStatuses returns all statuses with given repoIDs and shas
162-
func GetLatestCommitStatuses(repoSHAs []struct {
163-
RepoID int64
164-
SHA string
165-
}) ([][]*CommitStatus, error) {
161+
// GetIssuesLatestCommitStatuses returns all statuses with given repoIDs and shas
162+
func GetIssuesLatestCommitStatuses(issues []*Issue) ([][]*CommitStatus, error) {
166163
var cond = builder.NewCond()
167-
for i := 0; i < len(repoSHAs); i++ {
164+
var repoCache = make(map[int64]*git.Repository)
165+
var err error
166+
for i := 0; i < len(issues); i++ {
167+
var gitRepo *git.Repository
168+
var ok bool
169+
if gitRepo, ok = repoCache[issues[i].PullRequest.HeadRepoID]; !ok {
170+
if err := issues[i].PullRequest.GetHeadRepo(); err != nil {
171+
log.Error(4, "GetHeadRepo[%d, %d]: %v", issues[i].PullRequest.ID, issues[i].PullRequest.HeadRepoID, err)
172+
continue
173+
}
174+
175+
gitRepo, err = git.OpenRepository(issues[i].PullRequest.HeadRepo.RepoPath())
176+
if err != nil {
177+
log.Error(4, "OpenRepository[%d, %s]: %v", issues[i].PullRequest.ID, issues[i].PullRequest.HeadRepo.RepoPath(), err)
178+
continue
179+
}
180+
repoCache[issues[i].PullRequest.HeadRepoID] = gitRepo
181+
}
182+
183+
issues[i].PullRequest.LastCommitID, err = gitRepo.GetBranchCommitID(issues[i].PullRequest.HeadBranch)
184+
if err != nil {
185+
log.Error(4, "GetBranchCommitID[%d, %s]: %v", issues[i].PullRequest.ID, issues[i].PullRequest.HeadBranch, err)
186+
continue
187+
}
188+
168189
cond = cond.Or(builder.Eq{
169-
"repo_id": repoSHAs[i].RepoID,
170-
"sha": repoSHAs[i].SHA,
190+
"repo_id": issues[i].RepoID,
191+
"sha": issues[i].PullRequest.LastCommitID,
171192
})
172193
}
173194

174-
var ids = make([]int64, 0, len(repoSHAs))
175-
err := x.Table("commit_status").
195+
var ids = make([]int64, 0, len(issues))
196+
err = x.Table("commit_status").
176197
Where(cond).
177198
Select("max( id ) as id").
178199
GroupBy("repo_id, sha, context").
@@ -182,7 +203,7 @@ func GetLatestCommitStatuses(repoSHAs []struct {
182203
return nil, err
183204
}
184205

185-
var returns = make([][]*CommitStatus, len(repoSHAs))
206+
var returns = make([][]*CommitStatus, len(issues))
186207
if len(ids) == 0 {
187208
return returns, nil
188209
}
@@ -193,14 +214,15 @@ func GetLatestCommitStatuses(repoSHAs []struct {
193214
return nil, err
194215
}
195216

196-
var repoIDsMap = make(map[string][]int64, len(repoSHAs))
217+
var repoIDsMap = make(map[string][]int64, len(issues))
197218
for _, status := range statuses {
198219
key := fmt.Sprintf("%d-%s", status.RepoID, status.SHA)
199220
repoIDsMap[key] = append(repoIDsMap[key], status.ID)
200221
}
201222

202-
for i := 0; i < len(repoSHAs); i++ {
203-
for _, id := range repoIDsMap[fmt.Sprintf("%d-%s", repoSHAs[i].RepoID, repoSHAs[i].SHA)] {
223+
for i := 0; i < len(issues); i++ {
224+
key := fmt.Sprintf("%d-%s", issues[i].RepoID, issues[i].PullRequest.LastCommitID)
225+
for _, id := range repoIDsMap[key] {
204226
returns[i] = append(returns[i], statuses[id])
205227
}
206228
}

routers/repo/issue.go

Lines changed: 17 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -186,83 +186,29 @@ func issues(ctx *context.Context, milestoneID int64, isPullOption util.OptionalB
186186
}
187187
}
188188

189-
if !isPullList {
190-
// Get posters.
191-
for i := 0; i < len(issues); i++ {
192-
// Check read status
193-
if !ctx.IsSigned {
194-
issues[i].IsRead = true
195-
} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil {
196-
ctx.ServerError("GetIsRead", err)
197-
return
198-
}
189+
// Get posters.
190+
for i := 0; i < len(issues); i++ {
191+
// Check read status
192+
if !ctx.IsSigned {
193+
issues[i].IsRead = true
194+
} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil {
195+
ctx.ServerError("GetIsRead", err)
196+
return
199197
}
200-
} else {
201-
var repoSHAs = make([]struct {
202-
RepoID int64
203-
SHA string
204-
}, 0, len(issues))
205-
var pullIDs = make([]int64, 0, len(issues))
206-
var repoCache = make(map[int64]*git.Repository)
207-
208-
// Get posters.
209-
for i, issue := range issues {
210-
// Check read status
211-
if !ctx.IsSigned {
212-
issues[i].IsRead = true
213-
} else if err = issues[i].GetIsRead(ctx.User.ID); err != nil {
214-
ctx.ServerError("GetIsRead", err)
215-
return
216-
}
217-
218-
if err := issue.LoadAttributes(); err != nil {
219-
ctx.ServerError("LoadAttributes", err)
220-
return
221-
}
222-
223-
var gitRepo *git.Repository
224-
var ok bool
225-
if gitRepo, ok = repoCache[issue.PullRequest.HeadRepoID]; !ok {
226-
if err := issue.PullRequest.GetHeadRepo(); err != nil {
227-
ctx.ServerError("GetHeadRepo", err)
228-
return
229-
}
230-
231-
gitRepo, err = git.OpenRepository(issue.PullRequest.HeadRepo.RepoPath())
232-
if err != nil {
233-
ctx.ServerError("OpenRepository", err)
234-
return
235-
}
236-
repoCache[issue.PullRequest.HeadRepoID] = gitRepo
237-
}
198+
}
238199

239-
sha, err := gitRepo.GetBranchCommitID(issue.PullRequest.HeadBranch)
240-
if err != nil {
241-
log.Error(4, "GetBranchCommitID: %v", err)
242-
} else {
243-
repoSHAs = append(repoSHAs, struct {
244-
RepoID int64
245-
SHA string
246-
}{
247-
RepoID: issue.RepoID,
248-
SHA: sha,
249-
})
250-
pullIDs = append(pullIDs, issue.ID)
251-
}
200+
if isPullOption == util.OptionalBoolTrue && len(issues) > 0 {
201+
commitStatuses, err := models.GetIssuesLatestCommitStatuses(issues)
202+
if err != nil {
203+
ctx.ServerError("GetIssuesLatestCommitStatuses", err)
204+
return
252205
}
253206

254207
var issuesStates = make(map[int64]*models.CommitStatus, len(issues))
255-
if len(repoSHAs) > 0 {
256-
commitStatuses, err := models.GetLatestCommitStatuses(repoSHAs)
257-
if err != nil {
258-
ctx.ServerError("GetLatestCommitStatuses", err)
259-
return
260-
}
261-
262-
for i, statuses := range commitStatuses {
263-
issuesStates[pullIDs[i]] = models.CalcCommitStatus(statuses)
264-
}
208+
for i, statuses := range commitStatuses {
209+
issuesStates[issues[i].PullRequest.ID] = models.CalcCommitStatus(statuses)
265210
}
211+
266212
ctx.Data["IssuesStates"] = issuesStates
267213
}
268214

routers/user/home.go

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ import (
99
"fmt"
1010
"sort"
1111

12-
"code.gitea.io/git"
1312
"code.gitea.io/gitea/models"
1413
"code.gitea.io/gitea/modules/base"
1514
"code.gitea.io/gitea/modules/context"
16-
"code.gitea.io/gitea/modules/log"
1715
"code.gitea.io/gitea/modules/setting"
1816
"code.gitea.io/gitea/modules/util"
1917

@@ -307,69 +305,21 @@ func Issues(ctx *context.Context) {
307305
return
308306
}
309307

310-
if !isPullList {
311-
for _, issue := range issues {
312-
issue.Repo = showReposMap[issue.RepoID]
313-
}
314-
} else {
315-
var repoSHAs = make([]struct {
316-
RepoID int64
317-
SHA string
318-
}, 0, len(issues))
319-
var pullIDs = make([]int64, 0, len(issues))
320-
var repoCache = make(map[int64]*git.Repository)
321-
322-
for _, issue := range issues {
323-
issue.Repo = showReposMap[issue.RepoID]
324-
325-
if err := issue.LoadAttributes(); err != nil {
326-
ctx.ServerError("LoadAttributes", fmt.Errorf("%v", err))
327-
return
328-
}
329-
330-
var gitRepo *git.Repository
331-
var ok bool
332-
if gitRepo, ok = repoCache[issue.PullRequest.HeadRepoID]; !ok {
333-
if err := issue.PullRequest.GetHeadRepo(); err != nil {
334-
ctx.ServerError("GetHeadRepo", err)
335-
return
336-
}
337-
338-
gitRepo, err = git.OpenRepository(issue.PullRequest.HeadRepo.RepoPath())
339-
if err != nil {
340-
ctx.ServerError("OpenRepository", err)
341-
return
342-
}
343-
repoCache[issue.PullRequest.HeadRepoID] = gitRepo
344-
}
345-
346-
sha, err := gitRepo.GetBranchCommitID(issue.PullRequest.HeadBranch)
347-
if err != nil {
348-
log.Error(4, "GetBranchCommitID: %v", err)
349-
} else {
350-
repoSHAs = append(repoSHAs, struct {
351-
RepoID int64
352-
SHA string
353-
}{
354-
RepoID: issue.RepoID,
355-
SHA: sha,
356-
})
357-
pullIDs = append(pullIDs, issue.ID)
358-
}
308+
for _, issue := range issues {
309+
issue.Repo = showReposMap[issue.RepoID]
310+
}
311+
if isPullList && len(issues) > 0 {
312+
commitStatuses, err := models.GetIssuesLatestCommitStatuses(issues)
313+
if err != nil {
314+
ctx.ServerError("GetIssuesLatestCommitStatuses", err)
315+
return
359316
}
360317

361318
var issuesStates = make(map[int64]*models.CommitStatus, len(issues))
362-
if len(repoSHAs) > 0 {
363-
commitStatuses, err := models.GetLatestCommitStatuses(repoSHAs)
364-
if err != nil {
365-
ctx.ServerError("GetLatestCommitStatuses", err)
366-
return
367-
}
368-
369-
for i, statuses := range commitStatuses {
370-
issuesStates[pullIDs[i]] = models.CalcCommitStatus(statuses)
371-
}
319+
for i, statuses := range commitStatuses {
320+
issuesStates[issues[i].PullRequest.ID] = models.CalcCommitStatus(statuses)
372321
}
322+
373323
ctx.Data["IssuesStates"] = issuesStates
374324
}
375325

0 commit comments

Comments
 (0)