mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	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 <zettat123@gmail.com> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -38,20 +38,23 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	requiredCommitStatuses := make([]*git_model.CommitStatus, 0, len(commitStatuses)) | 	requiredCommitStatuses := make([]*git_model.CommitStatus, 0, len(commitStatuses)) | ||||||
|  | 	allRequiredContextsMatched := true | ||||||
| 	for _, gp := range requiredContextsGlob { | 	for _, gp := range requiredContextsGlob { | ||||||
|  | 		requiredContextMatched := false | ||||||
| 		for _, commitStatus := range commitStatuses { | 		for _, commitStatus := range commitStatuses { | ||||||
| 			if gp.Match(commitStatus.Context) { | 			if gp.Match(commitStatus.Context) { | ||||||
| 				requiredCommitStatuses = append(requiredCommitStatuses, commitStatus) | 				requiredCommitStatuses = append(requiredCommitStatuses, commitStatus) | ||||||
| 				break | 				requiredContextMatched = true | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		allRequiredContextsMatched = allRequiredContextsMatched && requiredContextMatched | ||||||
| 	} | 	} | ||||||
| 	if len(requiredCommitStatuses) == 0 { | 	if len(requiredCommitStatuses) == 0 { | ||||||
| 		return commitstatus.CommitStatusPending | 		return commitstatus.CommitStatusPending | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	returnedStatus := git_model.CalcCommitStatus(requiredCommitStatuses).State | 	returnedStatus := git_model.CalcCommitStatus(requiredCommitStatuses).State | ||||||
| 	if len(requiredCommitStatuses) == len(requiredContexts) { | 	if allRequiredContextsMatched { | ||||||
| 		return returnedStatus | 		return returnedStatus | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -58,6 +58,15 @@ func TestMergeRequiredContextsCommitStatus(t *testing.T) { | |||||||
| 			requiredContexts: []string{"Build*", "Build 2t*"}, | 			requiredContexts: []string{"Build*", "Build 2t*"}, | ||||||
| 			expected:         commitstatus.CommitStatusFailure, | 			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{ | 			commitStatuses: []*git_model.CommitStatus{ | ||||||
| 				{Context: "Build 1", State: commitstatus.CommitStatusSuccess}, | 				{Context: "Build 1", State: commitstatus.CommitStatusSuccess}, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user