From 618e2d8106d05b165f6de85a62cb77d811917a55 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Sun, 22 Jun 2025 17:31:46 -0600 Subject: [PATCH] Fix required contexts and commit status matching bug (#34815) Fix #34504 Since one required context can match more than one commit statuses, we should not directly compare the lengths of `requiredCommitStatuses` and `requiredContexts` --------- Signed-off-by: Zettat123 Co-authored-by: wxiaoguang --- services/pull/commit_status.go | 7 +++++-- services/pull/commit_status_test.go | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index d3a0f718a7..7952ca6fe3 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -38,20 +38,23 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, } requiredCommitStatuses := make([]*git_model.CommitStatus, 0, len(commitStatuses)) + allRequiredContextsMatched := true for _, gp := range requiredContextsGlob { + requiredContextMatched := false for _, commitStatus := range commitStatuses { if gp.Match(commitStatus.Context) { requiredCommitStatuses = append(requiredCommitStatuses, commitStatus) - break + requiredContextMatched = true } } + allRequiredContextsMatched = allRequiredContextsMatched && requiredContextMatched } if len(requiredCommitStatuses) == 0 { return commitstatus.CommitStatusPending } returnedStatus := git_model.CalcCommitStatus(requiredCommitStatuses).State - if len(requiredCommitStatuses) == len(requiredContexts) { + if allRequiredContextsMatched { return returnedStatus } diff --git a/services/pull/commit_status_test.go b/services/pull/commit_status_test.go index b985a9de8e..a58e788c04 100644 --- a/services/pull/commit_status_test.go +++ b/services/pull/commit_status_test.go @@ -58,6 +58,15 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) { requiredContexts: []string{"Build*", "Build 2t*"}, expected: commitstatus.CommitStatusFailure, }, + { + commitStatuses: []*git_model.CommitStatus{ + {Context: "Build 1", State: commitstatus.CommitStatusSuccess}, + {Context: "Build 2", State: commitstatus.CommitStatusSuccess}, + {Context: "Build 2t", State: commitstatus.CommitStatusFailure}, + }, + requiredContexts: []string{"Build*"}, + expected: commitstatus.CommitStatusFailure, + }, { commitStatuses: []*git_model.CommitStatus{ {Context: "Build 1", State: commitstatus.CommitStatusSuccess},