Skip to content

Commit

Permalink
Fixing the issue when status check per rule matches multiple actions. (
Browse files Browse the repository at this point in the history
  • Loading branch information
charles7668 committed Mar 6, 2024
1 parent 90a3f2d commit 8ab9e5b
Showing 1 changed file with 24 additions and 29 deletions.
53 changes: 24 additions & 29 deletions services/pull/commit_status.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 8ab9e5b

Please sign in to comment.