mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 02:46:04 +01:00 
			
		
		
		
	Keeping consistent between UI and API about combined commit status state and fix some bugs (#34562)
Extract from #34531 ## Move Commit status state to a standalone package Move the state from `structs` to `commitstatus` package. It also introduce `CommitStatusStates` so that the combine function could be used from UI and API logic. ## Combined commit status Changed This PR will follow Github's combined commit status. Before this PR, every commit status could be a combined one. According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference > Additionally, a combined state is returned. The state is one of: > failure if any of the contexts report as error or failure > pending if there are no statuses or a context is pending > success if the latest status for all contexts is success This PR will follow that rule and remove the `NoBetterThan` logic. This also fixes the inconsistent between UI and API. In the API convert package, it has implemented this which is different from the UI. It also fixed the missing `URL` and `CommitURL` in the API. ## `CalcCommitStatus` return nil if there is no commit statuses The behavior of `CalcCommitStatus` is changed. If the parameter commit statuses is empty, it will return nil. The reference places should check the returned value themselves.
This commit is contained in:
		
							
								
								
									
										81
									
								
								modules/commitstatus/commit_status.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								modules/commitstatus/commit_status.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved. | ||||
| // SPDX-License-Identifier: MIT | ||||
|  | ||||
| package commitstatus | ||||
|  | ||||
| // CommitStatusState holds the state of a CommitStatus | ||||
| // swagger:enum CommitStatusState | ||||
| type CommitStatusState string //nolint | ||||
|  | ||||
| const ( | ||||
| 	// CommitStatusPending is for when the CommitStatus is Pending | ||||
| 	CommitStatusPending CommitStatusState = "pending" | ||||
| 	// CommitStatusSuccess is for when the CommitStatus is Success | ||||
| 	CommitStatusSuccess CommitStatusState = "success" | ||||
| 	// CommitStatusError is for when the CommitStatus is Error | ||||
| 	CommitStatusError CommitStatusState = "error" | ||||
| 	// CommitStatusFailure is for when the CommitStatus is Failure | ||||
| 	CommitStatusFailure CommitStatusState = "failure" | ||||
| 	// CommitStatusWarning is for when the CommitStatus is Warning | ||||
| 	CommitStatusWarning CommitStatusState = "warning" | ||||
| 	// CommitStatusSkipped is for when CommitStatus is Skipped | ||||
| 	CommitStatusSkipped CommitStatusState = "skipped" | ||||
| ) | ||||
|  | ||||
| func (css CommitStatusState) String() string { | ||||
| 	return string(css) | ||||
| } | ||||
|  | ||||
| // IsPending represents if commit status state is pending | ||||
| func (css CommitStatusState) IsPending() bool { | ||||
| 	return css == CommitStatusPending | ||||
| } | ||||
|  | ||||
| // IsSuccess represents if commit status state is success | ||||
| func (css CommitStatusState) IsSuccess() bool { | ||||
| 	return css == CommitStatusSuccess | ||||
| } | ||||
|  | ||||
| // IsError represents if commit status state is error | ||||
| func (css CommitStatusState) IsError() bool { | ||||
| 	return css == CommitStatusError | ||||
| } | ||||
|  | ||||
| // IsFailure represents if commit status state is failure | ||||
| func (css CommitStatusState) IsFailure() bool { | ||||
| 	return css == CommitStatusFailure | ||||
| } | ||||
|  | ||||
| // IsWarning represents if commit status state is warning | ||||
| func (css CommitStatusState) IsWarning() bool { | ||||
| 	return css == CommitStatusWarning | ||||
| } | ||||
|  | ||||
| // IsSkipped represents if commit status state is skipped | ||||
| func (css CommitStatusState) IsSkipped() bool { | ||||
| 	return css == CommitStatusSkipped | ||||
| } | ||||
|  | ||||
| type CommitStatusStates []CommitStatusState //nolint | ||||
|  | ||||
| // According to https://docs.github.com/en/rest/commits/statuses?apiVersion=2022-11-28#get-the-combined-status-for-a-specific-reference | ||||
| // > Additionally, a combined state is returned. The state is one of: | ||||
| // > failure if any of the contexts report as error or failure | ||||
| // > pending if there are no statuses or a context is pending | ||||
| // > success if the latest status for all contexts is success | ||||
| func (css CommitStatusStates) Combine() CommitStatusState { | ||||
| 	successCnt := 0 | ||||
| 	for _, state := range css { | ||||
| 		switch { | ||||
| 		case state.IsError() || state.IsFailure(): | ||||
| 			return CommitStatusFailure | ||||
| 		case state.IsPending(): | ||||
| 		case state.IsSuccess() || state.IsWarning() || state.IsSkipped(): | ||||
| 			successCnt++ | ||||
| 		} | ||||
| 	} | ||||
| 	if successCnt > 0 && successCnt == len(css) { | ||||
| 		return CommitStatusSuccess | ||||
| 	} | ||||
| 	return CommitStatusPending | ||||
| } | ||||
		Reference in New Issue
	
	Block a user