Skip to content

Commit 580da8f

Browse files
GiteaBotlunny
andauthored
Fix branch protection priority (#24045) (#24061)
Backport #24045 by @lunny Fix #24044 Co-authored-by: Lunny Xiao <[email protected]>
1 parent 8644993 commit 580da8f

File tree

2 files changed

+79
-7
lines changed

2 files changed

+79
-7
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package git
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestBranchRuleMatchPriority(t *testing.T) {
14+
kases := []struct {
15+
Rules []string
16+
BranchName string
17+
ExpectedMatchIdx int
18+
}{
19+
{
20+
Rules: []string{"release/*", "release/v1.17"},
21+
BranchName: "release/v1.17",
22+
ExpectedMatchIdx: 1,
23+
},
24+
{
25+
Rules: []string{"release/v1.17", "release/*"},
26+
BranchName: "release/v1.17",
27+
ExpectedMatchIdx: 0,
28+
},
29+
{
30+
Rules: []string{"release/**/v1.17", "release/test/v1.17"},
31+
BranchName: "release/test/v1.17",
32+
ExpectedMatchIdx: 1,
33+
},
34+
{
35+
Rules: []string{"release/test/v1.17", "release/**/v1.17"},
36+
BranchName: "release/test/v1.17",
37+
ExpectedMatchIdx: 0,
38+
},
39+
{
40+
Rules: []string{"release/**", "release/v1.0.0"},
41+
BranchName: "release/v1.0.0",
42+
ExpectedMatchIdx: 1,
43+
},
44+
{
45+
Rules: []string{"release/v1.0.0", "release/**"},
46+
BranchName: "release/v1.0.0",
47+
ExpectedMatchIdx: 0,
48+
},
49+
{
50+
Rules: []string{"release/**", "release/v1.0.0"},
51+
BranchName: "release/v2.0.0",
52+
ExpectedMatchIdx: 0,
53+
},
54+
{
55+
Rules: []string{"release/*", "release/v1.0.0"},
56+
BranchName: "release/1/v2.0.0",
57+
ExpectedMatchIdx: -1,
58+
},
59+
}
60+
61+
for _, kase := range kases {
62+
var pbs ProtectedBranchRules
63+
for _, rule := range kase.Rules {
64+
pbs = append(pbs, &ProtectedBranch{RuleName: rule})
65+
}
66+
pbs.sort()
67+
matchedPB := pbs.GetFirstMatched(kase.BranchName)
68+
if matchedPB == nil {
69+
if kase.ExpectedMatchIdx >= 0 {
70+
assert.Error(t, fmt.Errorf("no matched rules but expected %s[%d]", kase.Rules[kase.ExpectedMatchIdx], kase.ExpectedMatchIdx))
71+
}
72+
} else {
73+
assert.EqualValues(t, kase.Rules[kase.ExpectedMatchIdx], matchedPB.RuleName)
74+
}
75+
}
76+
}

models/git/protected_branch_list.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,8 @@ func (rules ProtectedBranchRules) sort() {
2828
sort.Slice(rules, func(i, j int) bool {
2929
rules[i].loadGlob()
3030
rules[j].loadGlob()
31-
if rules[i].isPlainName {
32-
if !rules[j].isPlainName {
33-
return true
34-
}
35-
} else if rules[j].isPlainName {
36-
return true
31+
if rules[i].isPlainName != rules[j].isPlainName {
32+
return rules[i].isPlainName // plain name comes first, so plain name means "less"
3733
}
3834
return rules[i].CreatedUnix < rules[j].CreatedUnix
3935
})
@@ -46,7 +42,7 @@ func FindRepoProtectedBranchRules(ctx context.Context, repoID int64) (ProtectedB
4642
if err != nil {
4743
return nil, err
4844
}
49-
rules.sort()
45+
rules.sort() // to make non-glob rules have higher priority, and for same glob/non-glob rules, first created rules have higher priority
5046
return rules, nil
5147
}
5248

0 commit comments

Comments
 (0)