diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2021-04-16 01:34:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-15 19:34:43 +0200 |
commit | 8202dd131189102d2531c853665d213e43a5c818 (patch) | |
tree | 33fdf41bb1387611a7014d2335ab620628200e82 /services/pull/pull.go | |
parent | f44543a1bb776fa8bdfd3b605d67197d1466eb20 (diff) | |
download | gitea-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.go | 60 |
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 |