mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Fixing the issue when status check per rule matches multiple actions (#29631)
Close #29628 rule ``` Test / Build* Test / Build * Test / Build 2* Test / Build 1* ```  rule2 ``` Test / Build* Test / Build 1* ```  rule3 ``` Test / Build* Test / Build 1* NotExist* ```  --------- Co-authored-by: Zettat123 <zettat123@gmail.com>
This commit is contained in:
		| @@ -35,9 +35,9 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		for _, commitStatus := range commitStatuses { | ||||
| 		for _, gp := range requiredContextsGlob { | ||||
| 			var targetStatus structs.CommitStatusState | ||||
| 			for _, gp := range requiredContextsGlob { | ||||
| 			for _, commitStatus := range commitStatuses { | ||||
| 				if gp.Match(commitStatus.Context) { | ||||
| 					targetStatus = commitStatus.State | ||||
| 					matchedCount++ | ||||
| @@ -45,16 +45,20 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if targetStatus != "" && targetStatus.NoBetterThan(returnedStatus) { | ||||
| 			// If required rule not match any action, then it is pending | ||||
| 			if targetStatus == "" { | ||||
| 				if structs.CommitStatusPending.NoBetterThan(returnedStatus) { | ||||
| 					returnedStatus = structs.CommitStatusPending | ||||
| 				} | ||||
| 				break | ||||
| 			} | ||||
|  | ||||
| 			if targetStatus.NoBetterThan(returnedStatus) { | ||||
| 				returnedStatus = targetStatus | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if matchedCount != len(requiredContexts) { | ||||
| 		return structs.CommitStatusPending | ||||
| 	} | ||||
|  | ||||
| 	if matchedCount == 0 { | ||||
| 		status := git_model.CalcCommitStatus(commitStatuses) | ||||
| 		if status != nil { | ||||
|   | ||||
							
								
								
									
										65
									
								
								services/pull/commit_status_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								services/pull/commit_status_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| // Copyright 2024 The Gitea Authors. | ||||
| // All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package pull | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	git_model "code.gitea.io/gitea/models/git" | ||||
| 	"code.gitea.io/gitea/modules/structs" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestMergeRequiredContextsCommitStatus(t *testing.T) { | ||||
| 	testCases := [][]*git_model.CommitStatus{ | ||||
| 		{ | ||||
| 			{Context: "Build 1", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 3", State: structs.CommitStatusSuccess}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			{Context: "Build 1", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2t", State: structs.CommitStatusPending}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			{Context: "Build 1", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2t", State: structs.CommitStatusFailure}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			{Context: "Build 1", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2t", State: structs.CommitStatusSuccess}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			{Context: "Build 1", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2", State: structs.CommitStatusSuccess}, | ||||
| 			{Context: "Build 2t", State: structs.CommitStatusSuccess}, | ||||
| 		}, | ||||
| 	} | ||||
| 	testCasesRequiredContexts := [][]string{ | ||||
| 		{"Build*"}, | ||||
| 		{"Build*", "Build 2t*"}, | ||||
| 		{"Build*", "Build 2t*"}, | ||||
| 		{"Build*", "Build 2t*", "Build 3*"}, | ||||
| 		{"Build*", "Build *", "Build 2t*", "Build 1*"}, | ||||
| 	} | ||||
|  | ||||
| 	testCasesExpected := []structs.CommitStatusState{ | ||||
| 		structs.CommitStatusSuccess, | ||||
| 		structs.CommitStatusPending, | ||||
| 		structs.CommitStatusFailure, | ||||
| 		structs.CommitStatusPending, | ||||
| 		structs.CommitStatusSuccess, | ||||
| 	} | ||||
|  | ||||
| 	for i, commitStatuses := range testCases { | ||||
| 		if MergeRequiredContextsCommitStatus(commitStatuses, testCasesRequiredContexts[i]) != testCasesExpected[i] { | ||||
| 			assert.Fail(t, "Test case failed", "Test case %d failed", i+1) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user