diff --git a/models/pull.go b/models/pull.go index 07c58446d..aba104640 100644 --- a/models/pull.go +++ b/models/pull.go @@ -1058,29 +1058,30 @@ func (pr *PullRequest) checkAndUpdateStatus() { // TODO: test more pull requests at same time. func TestPullRequests() { prs := make([]*PullRequest, 0, 10) - x.Iterate(PullRequest{ - Status: PullRequestStatusChecking, - }, - func(idx int, bean interface{}) error { - pr := bean.(*PullRequest) - - if err := pr.GetBaseRepo(); err != nil { - log.Error(3, "GetBaseRepo: %v", err) - return nil - } - if pr.manuallyMerged() { - return nil - } - if err := pr.testPatch(); err != nil { - log.Error(3, "testPatch: %v", err) - return nil - } - prs = append(prs, pr) - return nil - }) + + err := x.Where("status = ?", PullRequestStatusChecking).Find(&prs) + if err != nil { + log.Error(3, "Find Checking PRs", err) + return + } + + var checkedPRs = make(map[int64]struct{}) // Update pull request status. for _, pr := range prs { + checkedPRs[pr.ID] = struct{}{} + if err := pr.GetBaseRepo(); err != nil { + log.Error(3, "GetBaseRepo: %v", err) + continue + } + if pr.manuallyMerged() { + continue + } + if err := pr.testPatch(); err != nil { + log.Error(3, "testPatch: %v", err) + continue + } + pr.checkAndUpdateStatus() } @@ -1089,7 +1090,12 @@ func TestPullRequests() { log.Trace("TestPullRequests[%v]: processing test task", prID) pullRequestQueue.Remove(prID) - pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64()) + id := com.StrTo(prID).MustInt64() + if _, ok := checkedPRs[id]; ok { + continue + } + + pr, err := GetPullRequestByID(id) if err != nil { log.Error(4, "GetPullRequestByID[%s]: %v", prID, err) continue