diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index 3282f4f379a01..2dc80f4e7f09b 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -21,46 +21,41 @@ import ( // 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 - } + if len(requiredContexts) == 0 { + return returnedStatus + } + + 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 } + } + for _, gp := range requiredContextsGlob { + var targetStatus structs.CommitStatusState for _, commitStatus := range commitStatuses { - var targetStatus structs.CommitStatusState - for _, gp := range requiredContextsGlob { - if gp.Match(commitStatus.Context) { - targetStatus = commitStatus.State - matchedCount++ - break - } + if gp.Match(commitStatus.Context) { + targetStatus = commitStatus.State + break } + } - if targetStatus != "" && targetStatus.NoBetterThan(returnedStatus) { - returnedStatus = targetStatus + // If required rule not match any action, then it is pending + if targetStatus == "" { + if structs.CommitStatusPending.NoBetterThan(returnedStatus) { + returnedStatus = structs.CommitStatusPending } + break } - } - if matchedCount != len(requiredContexts) { - return structs.CommitStatusPending - } - - if matchedCount == 0 { - status := git_model.CalcCommitStatus(commitStatuses) - if status != nil { - return status.State + if targetStatus != "" && targetStatus.NoBetterThan(returnedStatus) { + returnedStatus = targetStatus } - return structs.CommitStatusSuccess } return returnedStatus