aboutsummaryrefslogtreecommitdiffstats
path: root/services/pull/commit_status.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/pull/commit_status.go')
-rw-r--r--services/pull/commit_status.go79
1 files changed, 34 insertions, 45 deletions
diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go
index 58d26c5a00..d3a0f718a7 100644
--- a/services/pull/commit_status.go
+++ b/services/pull/commit_status.go
@@ -10,67 +10,56 @@ import (
"code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
issues_model "code.gitea.io/gitea/models/issues"
+ "code.gitea.io/gitea/modules/commitstatus"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/structs"
"github.com/gobwas/glob"
"github.com/pkg/errors"
)
// MergeRequiredContextsCommitStatus returns a commit status state for given required contexts
-func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, requiredContexts []string) structs.CommitStatusState {
- // matchedCount is the number of `CommitStatus.Context` that match any context of `requiredContexts`
- matchedCount := 0
- returnedStatus := structs.CommitStatusSuccess
-
- if len(requiredContexts) > 0 {
- requiredContextsGlob := make(map[string]glob.Glob, len(requiredContexts))
- for _, ctx := range requiredContexts {
- if gp, err := glob.Compile(ctx); err != nil {
- log.Error("glob.Compile %s failed. Error: %v", ctx, err)
- } else {
- requiredContextsGlob[ctx] = gp
- }
- }
+func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, requiredContexts []string) commitstatus.CommitStatusState {
+ if len(commitStatuses) == 0 {
+ return commitstatus.CommitStatusPending
+ }
- for _, gp := range requiredContextsGlob {
- var targetStatus structs.CommitStatusState
- for _, commitStatus := range commitStatuses {
- if gp.Match(commitStatus.Context) {
- targetStatus = commitStatus.State
- matchedCount++
- break
- }
- }
+ if len(requiredContexts) == 0 {
+ return git_model.CalcCommitStatus(commitStatuses).State
+ }
- // If required rule not match any action, then it is pending
- if targetStatus == "" {
- if structs.CommitStatusPending.HasHigherPriorityThan(returnedStatus) {
- returnedStatus = structs.CommitStatusPending
- }
- break
- }
+ requiredContextsGlob := make(map[string]glob.Glob, len(requiredContexts))
+ for _, ctx := range requiredContexts {
+ if gp, err := glob.Compile(ctx); err != nil {
+ log.Error("glob.Compile %s failed. Error: %v", ctx, err)
+ } else {
+ requiredContextsGlob[ctx] = gp
+ }
+ }
- if targetStatus.HasHigherPriorityThan(returnedStatus) {
- returnedStatus = targetStatus
+ requiredCommitStatuses := make([]*git_model.CommitStatus, 0, len(commitStatuses))
+ for _, gp := range requiredContextsGlob {
+ for _, commitStatus := range commitStatuses {
+ if gp.Match(commitStatus.Context) {
+ requiredCommitStatuses = append(requiredCommitStatuses, commitStatus)
+ break
}
}
}
+ if len(requiredCommitStatuses) == 0 {
+ return commitstatus.CommitStatusPending
+ }
- if matchedCount == 0 && returnedStatus == structs.CommitStatusSuccess {
- if len(commitStatuses) == 0 {
- // "no statuses" should mean "pending"
- return structs.CommitStatusPending
- }
- status := git_model.CalcCommitStatus(commitStatuses)
- if status.State == structs.CommitStatusSkipped {
- return structs.CommitStatusSuccess // if all statuses are skipped, return success
- }
- return status.State
+ returnedStatus := git_model.CalcCommitStatus(requiredCommitStatuses).State
+ if len(requiredCommitStatuses) == len(requiredContexts) {
+ return returnedStatus
}
- return returnedStatus
+ if returnedStatus == commitstatus.CommitStatusFailure {
+ return commitstatus.CommitStatusFailure
+ }
+ // even if part of success, return pending
+ return commitstatus.CommitStatusPending
}
// IsPullCommitStatusPass returns if all required status checks PASS
@@ -91,7 +80,7 @@ func IsPullCommitStatusPass(ctx context.Context, pr *issues_model.PullRequest) (
}
// GetPullRequestCommitStatusState returns pull request merged commit status state
-func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullRequest) (structs.CommitStatusState, error) {
+func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullRequest) (commitstatus.CommitStatusState, error) {
// Ensure HeadRepo is loaded
if err := pr.LoadHeadRepo(ctx); err != nil {
return "", errors.Wrap(err, "LoadHeadRepo")