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
This commit is contained in:
parent
cca13ae2ac
commit
81daf26878
9 changed files with 159 additions and 84 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue