forked from gitea/gitea
1
0
Fork 0

Fix branch protection priority (#24045)

Fix #24044
This commit is contained in:
Lunny Xiao 2023-04-12 01:22:49 +08:00 committed by GitHub
parent 60fb63ba08
commit 0536712ee7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 79 additions and 7 deletions

View 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)
}
}
}

View File

@ -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
} }