Skip to content

Commit d67e406

Browse files
authored
Improve LoadUnitConfig to handle invalid or duplicate units (#23736)
The old code just parses an invalid key to `TypeInvalid` and uses it as normal, and duplicate keys will be kept. So this PR will ignore invalid key and log warning and also deduplicate valid units.
1 parent ca905b8 commit d67e406

File tree

3 files changed

+77
-17
lines changed

3 files changed

+77
-17
lines changed

models/unit/unit.go

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,11 @@ func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type {
151151

152152
// LoadUnitConfig load units from settings
153153
func LoadUnitConfig() {
154-
DisabledRepoUnits = FindUnitTypes(setting.Repository.DisabledRepoUnits...)
154+
var invalidKeys []string
155+
DisabledRepoUnits, invalidKeys = FindUnitTypes(setting.Repository.DisabledRepoUnits...)
156+
if len(invalidKeys) > 0 {
157+
log.Warn("Invalid keys in disabled repo units: %s", strings.Join(invalidKeys, ", "))
158+
}
155159
// Check that must units are not disabled
156160
for i, disabledU := range DisabledRepoUnits {
157161
if !disabledU.CanDisable() {
@@ -160,9 +164,15 @@ func LoadUnitConfig() {
160164
}
161165
}
162166

163-
setDefaultRepoUnits := FindUnitTypes(setting.Repository.DefaultRepoUnits...)
167+
setDefaultRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultRepoUnits...)
168+
if len(invalidKeys) > 0 {
169+
log.Warn("Invalid keys in default repo units: %s", strings.Join(invalidKeys, ", "))
170+
}
164171
DefaultRepoUnits = validateDefaultRepoUnits(DefaultRepoUnits, setDefaultRepoUnits)
165-
setDefaultForkRepoUnits := FindUnitTypes(setting.Repository.DefaultForkRepoUnits...)
172+
setDefaultForkRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultForkRepoUnits...)
173+
if len(invalidKeys) > 0 {
174+
log.Warn("Invalid keys in default fork repo units: %s", strings.Join(invalidKeys, ", "))
175+
}
166176
DefaultForkRepoUnits = validateDefaultRepoUnits(DefaultForkRepoUnits, setDefaultForkRepoUnits)
167177
}
168178

@@ -334,22 +344,19 @@ var (
334344
}
335345
)
336346

337-
// FindUnitTypes give the unit key names and return unit
338-
func FindUnitTypes(nameKeys ...string) (res []Type) {
347+
// FindUnitTypes give the unit key names and return valid unique units and invalid keys
348+
func FindUnitTypes(nameKeys ...string) (res []Type, invalidKeys []string) {
349+
m := map[Type]struct{}{}
339350
for _, key := range nameKeys {
340-
var found bool
341-
for t, u := range Units {
342-
if strings.EqualFold(key, u.NameKey) {
343-
res = append(res, t)
344-
found = true
345-
break
346-
}
347-
}
348-
if !found {
349-
res = append(res, TypeInvalid)
351+
t := TypeFromKey(key)
352+
if t == TypeInvalid {
353+
invalidKeys = append(invalidKeys, key)
354+
} else if _, ok := m[t]; !ok {
355+
res = append(res, t)
356+
m[t] = struct{}{}
350357
}
351358
}
352-
return res
359+
return res, invalidKeys
353360
}
354361

355362
// TypeFromKey give the unit key name and return unit

models/unit/unit_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package unit
5+
6+
import (
7+
"testing"
8+
9+
"code.gitea.io/gitea/modules/setting"
10+
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestLoadUnitConfig(t *testing.T) {
15+
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) {
16+
DisabledRepoUnits = disabledRepoUnits
17+
DefaultRepoUnits = defaultRepoUnits
18+
DefaultForkRepoUnits = defaultForkRepoUnits
19+
}(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits)
20+
defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) {
21+
setting.Repository.DisabledRepoUnits = disabledRepoUnits
22+
setting.Repository.DefaultRepoUnits = defaultRepoUnits
23+
setting.Repository.DefaultForkRepoUnits = defaultForkRepoUnits
24+
}(setting.Repository.DisabledRepoUnits, setting.Repository.DefaultRepoUnits, setting.Repository.DefaultForkRepoUnits)
25+
26+
t.Run("regular", func(t *testing.T) {
27+
setting.Repository.DisabledRepoUnits = []string{"repo.issues"}
28+
setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls"}
29+
setting.Repository.DefaultForkRepoUnits = []string{"repo.releases"}
30+
LoadUnitConfig()
31+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
32+
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
33+
assert.Equal(t, []Type{TypeCode, TypeReleases}, DefaultForkRepoUnits)
34+
})
35+
t.Run("invalid", func(t *testing.T) {
36+
setting.Repository.DisabledRepoUnits = []string{"repo.issues", "invalid.1"}
37+
setting.Repository.DefaultRepoUnits = []string{"repo.code", "invalid.2", "repo.releases", "repo.issues", "repo.pulls"}
38+
setting.Repository.DefaultForkRepoUnits = []string{"invalid.3", "repo.releases"}
39+
LoadUnitConfig()
40+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
41+
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
42+
assert.Equal(t, []Type{TypeCode, TypeReleases}, DefaultForkRepoUnits)
43+
})
44+
t.Run("duplicate", func(t *testing.T) {
45+
setting.Repository.DisabledRepoUnits = []string{"repo.issues", "repo.issues"}
46+
setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls", "repo.code"}
47+
setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"}
48+
LoadUnitConfig()
49+
assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits)
50+
assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits)
51+
assert.Equal(t, []Type{TypeCode, TypeReleases}, DefaultForkRepoUnits)
52+
})
53+
}

routers/api/v1/org/team.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func GetTeam(ctx *context.APIContext) {
135135
}
136136

137137
func attachTeamUnits(team *organization.Team, units []string) {
138-
unitTypes := unit_model.FindUnitTypes(units...)
138+
unitTypes, _ := unit_model.FindUnitTypes(units...)
139139
team.Units = make([]*organization.TeamUnit, 0, len(units))
140140
for _, tp := range unitTypes {
141141
team.Units = append(team.Units, &organization.TeamUnit{

0 commit comments

Comments
 (0)