mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	
							
								
								
									
										76
									
								
								models/git/protected_banch_list_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								models/git/protected_banch_list_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestBranchRuleMatchPriority(t *testing.T) {
 | 
				
			||||||
 | 
						kases := []struct {
 | 
				
			||||||
 | 
							Rules            []string
 | 
				
			||||||
 | 
							BranchName       string
 | 
				
			||||||
 | 
							ExpectedMatchIdx int
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/*", "release/v1.17"},
 | 
				
			||||||
 | 
								BranchName:       "release/v1.17",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 1,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/v1.17", "release/*"},
 | 
				
			||||||
 | 
								BranchName:       "release/v1.17",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/**/v1.17", "release/test/v1.17"},
 | 
				
			||||||
 | 
								BranchName:       "release/test/v1.17",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 1,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/test/v1.17", "release/**/v1.17"},
 | 
				
			||||||
 | 
								BranchName:       "release/test/v1.17",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/**", "release/v1.0.0"},
 | 
				
			||||||
 | 
								BranchName:       "release/v1.0.0",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 1,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/v1.0.0", "release/**"},
 | 
				
			||||||
 | 
								BranchName:       "release/v1.0.0",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/**", "release/v1.0.0"},
 | 
				
			||||||
 | 
								BranchName:       "release/v2.0.0",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: 0,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								Rules:            []string{"release/*", "release/v1.0.0"},
 | 
				
			||||||
 | 
								BranchName:       "release/1/v2.0.0",
 | 
				
			||||||
 | 
								ExpectedMatchIdx: -1,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, kase := range kases {
 | 
				
			||||||
 | 
							var pbs ProtectedBranchRules
 | 
				
			||||||
 | 
							for _, rule := range kase.Rules {
 | 
				
			||||||
 | 
								pbs = append(pbs, &ProtectedBranch{RuleName: rule})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							pbs.sort()
 | 
				
			||||||
 | 
							matchedPB := pbs.GetFirstMatched(kase.BranchName)
 | 
				
			||||||
 | 
							if matchedPB == nil {
 | 
				
			||||||
 | 
								if kase.ExpectedMatchIdx >= 0 {
 | 
				
			||||||
 | 
									assert.Error(t, fmt.Errorf("no matched rules but expected %s[%d]", kase.Rules[kase.ExpectedMatchIdx], kase.ExpectedMatchIdx))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								assert.EqualValues(t, kase.Rules[kase.ExpectedMatchIdx], matchedPB.RuleName)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -28,12 +28,8 @@ func (rules ProtectedBranchRules) sort() {
 | 
				
			|||||||
	sort.Slice(rules, func(i, j int) bool {
 | 
						sort.Slice(rules, func(i, j int) bool {
 | 
				
			||||||
		rules[i].loadGlob()
 | 
							rules[i].loadGlob()
 | 
				
			||||||
		rules[j].loadGlob()
 | 
							rules[j].loadGlob()
 | 
				
			||||||
		if rules[i].isPlainName {
 | 
							if rules[i].isPlainName != rules[j].isPlainName {
 | 
				
			||||||
			if !rules[j].isPlainName {
 | 
								return rules[i].isPlainName // plain name comes first, so plain name means "less"
 | 
				
			||||||
				return true
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if rules[j].isPlainName {
 | 
					 | 
				
			||||||
			return true
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return rules[i].CreatedUnix < rules[j].CreatedUnix
 | 
							return rules[i].CreatedUnix < rules[j].CreatedUnix
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -46,7 +42,7 @@ func FindRepoProtectedBranchRules(ctx context.Context, repoID int64) (ProtectedB
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	rules.sort()
 | 
						rules.sort() // to make non-glob rules have higher priority, and for same glob/non-glob rules, first created rules have higher priority
 | 
				
			||||||
	return rules, nil
 | 
						return rules, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user