diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2020-01-22 11:46:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-22 11:46:04 +0800 |
commit | 81daf26878d8a7e14c172fc39fc55c36281b1898 (patch) | |
tree | 9d4d43bf2e12cdc9c56196938d0618e9577cd1b6 /services | |
parent | cca13ae2acf1ef7a3b0516a8774dff0365b73697 (diff) | |
download | gitea-81daf26878d8a7e14c172fc39fc55c36281b1898.tar.gz gitea-81daf26878d8a7e14c172fc39fc55c36281b1898.zip |
Fix wrong hint when status checking is running on pull request view (#9886)
* Fix wrong hint when status checking is running on pull request view
* fix lint
* fix test
* fix test
* fix wrong tmpl
* fix import
* rename function name
Diffstat (limited to 'services')
-rw-r--r-- | services/pull/commit_status.go | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index ca00cdaad9..3dccfb1f0c 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -8,15 +8,47 @@ package pull import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/structs" + "github.com/pkg/errors" ) +// MergeRequiredContextsCommitStatus returns a commit status state for given required contexts +func MergeRequiredContextsCommitStatus(commitStatuses []*models.CommitStatus, requiredContexts []string) structs.CommitStatusState { + if len(requiredContexts) == 0 { + status := models.CalcCommitStatus(commitStatuses) + if status != nil { + return status.State + } + return structs.CommitStatusSuccess + } + + var returnedStatus = structs.CommitStatusPending + for _, ctx := range requiredContexts { + var targetStatus structs.CommitStatusState + for _, commitStatus := range commitStatuses { + if commitStatus.Context == ctx { + targetStatus = commitStatus.State + break + } + } + + if targetStatus == "" { + targetStatus = structs.CommitStatusPending + } + if targetStatus.NoBetterThan(returnedStatus) { + returnedStatus = targetStatus + } + } + return returnedStatus +} + // IsCommitStatusContextSuccess returns true if all required status check contexts succeed. func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, requiredContexts []string) bool { // If no specific context is required, require that last commit status is a success if len(requiredContexts) == 0 { status := models.CalcCommitStatus(commitStatuses) - if status == nil || status.State != models.CommitStatusSuccess { + if status == nil || status.State != structs.CommitStatusSuccess { return false } return true @@ -26,7 +58,7 @@ func IsCommitStatusContextSuccess(commitStatuses []*models.CommitStatus, require var found bool for _, commitStatus := range commitStatuses { if commitStatus.Context == ctx { - if commitStatus.State != models.CommitStatusSuccess { + if commitStatus.State != structs.CommitStatusSuccess { return false } @@ -50,30 +82,39 @@ func IsPullCommitStatusPass(pr *models.PullRequest) (bool, error) { return true, nil } + state, err := GetPullRequestCommitStatusState(pr) + if err != nil { + return false, err + } + return state.IsSuccess(), nil +} + +// GetPullRequestCommitStatusState returns pull request merged commit status state +func GetPullRequestCommitStatusState(pr *models.PullRequest) (structs.CommitStatusState, error) { // check if all required status checks are successful headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) if err != nil { - return false, errors.Wrap(err, "OpenRepository") + return "", errors.Wrap(err, "OpenRepository") } defer headGitRepo.Close() if !headGitRepo.IsBranchExist(pr.HeadBranch) { - return false, errors.New("Head branch does not exist, can not merge") + return "", errors.New("Head branch does not exist, can not merge") } sha, err := headGitRepo.GetBranchCommitID(pr.HeadBranch) if err != nil { - return false, errors.Wrap(err, "GetBranchCommitID") + return "", errors.Wrap(err, "GetBranchCommitID") } if err := pr.LoadBaseRepo(); err != nil { - return false, errors.Wrap(err, "LoadBaseRepo") + return "", errors.Wrap(err, "LoadBaseRepo") } commitStatuses, err := models.GetLatestCommitStatus(pr.BaseRepo, sha, 0) if err != nil { - return false, errors.Wrap(err, "GetLatestCommitStatus") + return "", errors.Wrap(err, "GetLatestCommitStatus") } - return IsCommitStatusContextSuccess(commitStatuses, pr.ProtectedBranch.StatusCheckContexts), nil + return MergeRequiredContextsCommitStatus(commitStatuses, pr.ProtectedBranch.StatusCheckContexts), nil } |