aboutsummaryrefslogtreecommitdiffstats
path: root/services/pull/pull.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2021-04-16 01:34:43 +0800
committerGitHub <noreply@github.com>2021-04-15 19:34:43 +0200
commit8202dd131189102d2531c853665d213e43a5c818 (patch)
tree33fdf41bb1387611a7014d2335ab620628200e82 /services/pull/pull.go
parentf44543a1bb776fa8bdfd3b605d67197d1466eb20 (diff)
downloadgitea-8202dd131189102d2531c853665d213e43a5c818.tar.gz
gitea-8202dd131189102d2531c853665d213e43a5c818.zip
Performance improvement for list pull requests (#15447)
Diffstat (limited to 'services/pull/pull.go')
-rw-r--r--services/pull/pull.go60
1 files changed, 50 insertions, 10 deletions
diff --git a/services/pull/pull.go b/services/pull/pull.go
index 331ef46d3d..153a75094d 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -8,7 +8,6 @@ import (
"bufio"
"bytes"
"context"
- "errors"
"fmt"
"strings"
"time"
@@ -643,33 +642,74 @@ func GetSquashMergeCommitMessages(pr *models.PullRequest) string {
return stringBuilder.String()
}
+// GetIssuesLastCommitStatus returns a map
+func GetIssuesLastCommitStatus(issues models.IssueList) (map[int64]*models.CommitStatus, error) {
+ if err := issues.LoadPullRequests(); err != nil {
+ return nil, err
+ }
+ if _, err := issues.LoadRepositories(); err != nil {
+ return nil, err
+ }
+
+ var (
+ gitRepos = make(map[int64]*git.Repository)
+ res = make(map[int64]*models.CommitStatus)
+ err error
+ )
+ defer func() {
+ for _, gitRepo := range gitRepos {
+ gitRepo.Close()
+ }
+ }()
+
+ for _, issue := range issues {
+ if !issue.IsPull {
+ continue
+ }
+ gitRepo, ok := gitRepos[issue.RepoID]
+ if !ok {
+ gitRepo, err = git.OpenRepository(issue.Repo.RepoPath())
+ if err != nil {
+ return nil, err
+ }
+ gitRepos[issue.RepoID] = gitRepo
+ }
+
+ status, err := getLastCommitStatus(gitRepo, issue.PullRequest)
+ if err != nil {
+ return nil, err
+ }
+ res[issue.PullRequest.ID] = status
+ }
+ return res, nil
+}
+
// GetLastCommitStatus returns list of commit statuses for latest commit on this pull request.
-func GetLastCommitStatus(pr *models.PullRequest) (status []*models.CommitStatus, err error) {
+func GetLastCommitStatus(pr *models.PullRequest) (status *models.CommitStatus, err error) {
if err = pr.LoadBaseRepo(); err != nil {
return nil, err
}
-
gitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath())
if err != nil {
return nil, err
}
defer gitRepo.Close()
- compareInfo, err := gitRepo.GetCompareInfo(pr.BaseRepo.RepoPath(), pr.MergeBase, pr.GetGitRefName())
+ return getLastCommitStatus(gitRepo, pr)
+}
+
+// getLastCommitStatus get pr's last commit status. PR's last commit status is the head commit id's last commit status
+func getLastCommitStatus(gitRepo *git.Repository, pr *models.PullRequest) (status *models.CommitStatus, err error) {
+ sha, err := gitRepo.GetRefCommitID(pr.GetGitRefName())
if err != nil {
return nil, err
}
- if compareInfo.Commits.Len() == 0 {
- return nil, errors.New("pull request has no commits")
- }
-
- sha := compareInfo.Commits.Front().Value.(*git.Commit).ID.String()
statusList, err := models.GetLatestCommitStatus(pr.BaseRepo.ID, sha, models.ListOptions{})
if err != nil {
return nil, err
}
- return statusList, nil
+ return models.CalcCommitStatus(statusList), nil
}
// IsHeadEqualWithBranch returns if the commits of branchName are available in pull request head