mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	refactor improve NoBetterThan (#26126)
- The `NoBetterThan` function can only handle comparisons between "pending," "success," "error," and "failure." For any other comparison, we directly return false. This prevents logic errors like the one in #26121. - The callers of the `NoBetterThan` function should also avoid making incomparable calls. --------- Co-authored-by: yp05327 <576951401@qq.com> Co-authored-by: puni9869 <80308335+puni9869@users.noreply.github.com>
This commit is contained in:
		@@ -4,7 +4,7 @@
 | 
				
			|||||||
package structs
 | 
					package structs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CommitStatusState holds the state of a CommitStatus
 | 
					// CommitStatusState holds the state of a CommitStatus
 | 
				
			||||||
// It can be "pending", "success", "error", "failure", and "warning"
 | 
					// It can be "pending", "success", "error" and "failure"
 | 
				
			||||||
type CommitStatusState string
 | 
					type CommitStatusState string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -18,14 +18,25 @@ const (
 | 
				
			|||||||
	CommitStatusFailure CommitStatusState = "failure"
 | 
						CommitStatusFailure CommitStatusState = "failure"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var commitStatusPriorities = map[CommitStatusState]int{
 | 
				
			||||||
 | 
						CommitStatusError:   0,
 | 
				
			||||||
 | 
						CommitStatusFailure: 1,
 | 
				
			||||||
 | 
						CommitStatusPending: 2,
 | 
				
			||||||
 | 
						CommitStatusSuccess: 3,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NoBetterThan returns true if this State is no better than the given State
 | 
					// NoBetterThan returns true if this State is no better than the given State
 | 
				
			||||||
 | 
					// This function only handles the states defined in CommitStatusPriorities
 | 
				
			||||||
func (css CommitStatusState) NoBetterThan(css2 CommitStatusState) bool {
 | 
					func (css CommitStatusState) NoBetterThan(css2 CommitStatusState) bool {
 | 
				
			||||||
	commitStatusPriorities := map[CommitStatusState]int{
 | 
						// NoBetterThan only handles the 4 states above
 | 
				
			||||||
		CommitStatusError:   0,
 | 
						if _, exist := commitStatusPriorities[css]; !exist {
 | 
				
			||||||
		CommitStatusFailure: 1,
 | 
							return false
 | 
				
			||||||
		CommitStatusPending: 2,
 | 
					 | 
				
			||||||
		CommitStatusSuccess: 3,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, exist := commitStatusPriorities[css2]; !exist {
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return commitStatusPriorities[css] <= commitStatusPriorities[css2]
 | 
						return commitStatusPriorities[css] <= commitStatusPriorities[css2]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										174
									
								
								modules/structs/commit_status_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								modules/structs/commit_status_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
				
			|||||||
 | 
					// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package structs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNoBetterThan(t *testing.T) {
 | 
				
			||||||
 | 
						type args struct {
 | 
				
			||||||
 | 
							css  CommitStatusState
 | 
				
			||||||
 | 
							css2 CommitStatusState
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var unExpectedState CommitStatusState
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name string
 | 
				
			||||||
 | 
							args args
 | 
				
			||||||
 | 
							want bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "success is no better than success",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusSuccess,
 | 
				
			||||||
 | 
									css2: CommitStatusSuccess,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "success is no better than pending",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusSuccess,
 | 
				
			||||||
 | 
									css2: CommitStatusPending,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "success is no better than failure",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusSuccess,
 | 
				
			||||||
 | 
									css2: CommitStatusFailure,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "success is no better than error",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusSuccess,
 | 
				
			||||||
 | 
									css2: CommitStatusError,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "pending is no better than success",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusPending,
 | 
				
			||||||
 | 
									css2: CommitStatusSuccess,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "pending is no better than pending",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusPending,
 | 
				
			||||||
 | 
									css2: CommitStatusPending,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "pending is no better than failure",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusPending,
 | 
				
			||||||
 | 
									css2: CommitStatusFailure,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "pending is no better than error",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusPending,
 | 
				
			||||||
 | 
									css2: CommitStatusError,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "failure is no better than success",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusFailure,
 | 
				
			||||||
 | 
									css2: CommitStatusSuccess,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "failure is no better than pending",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusFailure,
 | 
				
			||||||
 | 
									css2: CommitStatusPending,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "failure is no better than failure",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusFailure,
 | 
				
			||||||
 | 
									css2: CommitStatusFailure,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "failure is no better than error",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusFailure,
 | 
				
			||||||
 | 
									css2: CommitStatusError,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "error is no better than success",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusError,
 | 
				
			||||||
 | 
									css2: CommitStatusSuccess,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "error is no better than pending",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusError,
 | 
				
			||||||
 | 
									css2: CommitStatusPending,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "error is no better than failure",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusError,
 | 
				
			||||||
 | 
									css2: CommitStatusFailure,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "error is no better than error",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  CommitStatusError,
 | 
				
			||||||
 | 
									css2: CommitStatusError,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "unExpectedState is no better than success",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  unExpectedState,
 | 
				
			||||||
 | 
									css2: CommitStatusSuccess,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "unExpectedState is no better than unExpectedState",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									css:  unExpectedState,
 | 
				
			||||||
 | 
									css2: unExpectedState,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
 | 
								result := tt.args.css.NoBetterThan(tt.args.css2)
 | 
				
			||||||
 | 
								if result != tt.want {
 | 
				
			||||||
 | 
									t.Errorf("NoBetterThan() = %v, want %v", result, tt.want)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -48,7 +48,7 @@ func ToCombinedStatus(ctx context.Context, statuses []*git_model.CommitStatus, r
 | 
				
			|||||||
	retStatus.Statuses = make([]*api.CommitStatus, 0, len(statuses))
 | 
						retStatus.Statuses = make([]*api.CommitStatus, 0, len(statuses))
 | 
				
			||||||
	for _, status := range statuses {
 | 
						for _, status := range statuses {
 | 
				
			||||||
		retStatus.Statuses = append(retStatus.Statuses, ToCommitStatus(ctx, status))
 | 
							retStatus.Statuses = append(retStatus.Statuses, ToCommitStatus(ctx, status))
 | 
				
			||||||
		if status.State.NoBetterThan(retStatus.State) {
 | 
							if retStatus.State == "" || status.State.NoBetterThan(retStatus.State) {
 | 
				
			||||||
			retStatus.State = status.State
 | 
								retStatus.State = status.State
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							@@ -16514,7 +16514,7 @@
 | 
				
			|||||||
      "x-go-package": "code.gitea.io/gitea/modules/structs"
 | 
					      "x-go-package": "code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "CommitStatusState": {
 | 
					    "CommitStatusState": {
 | 
				
			||||||
      "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\", \"failure\", and \"warning\"",
 | 
					      "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\" and \"failure\"",
 | 
				
			||||||
      "type": "string",
 | 
					      "type": "string",
 | 
				
			||||||
      "x-go-package": "code.gitea.io/gitea/modules/structs"
 | 
					      "x-go-package": "code.gitea.io/gitea/modules/structs"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user