loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix data-race during testing (#30999)

Fix #30992

(cherry picked from commit 47accfebbd69e5f47d1b97a3e39cf181fab7e597)

Conflicts:
models/unit/unit.go
trivial context conflict because of
e07b0e75ff Add a direct link from repo header to unit settings

authored by

wxiaoguang and committed by
Earl Warren
f6e50abd a649610d

+36 -20
+20 -6
models/unit/unit.go
··· 7 7 "errors" 8 8 "fmt" 9 9 "strings" 10 + "sync/atomic" 10 11 11 12 "code.gitea.io/gitea/models/perm" 12 13 "code.gitea.io/gitea/modules/container" ··· 106 107 TypeExternalTracker, 107 108 } 108 109 109 - // DisabledRepoUnits contains the units that have been globally disabled 110 - DisabledRepoUnits = []Type{} 110 + disabledRepoUnitsAtomic atomic.Pointer[[]Type] // the units that have been globally disabled 111 111 112 112 // AllowedRepoUnitGroups contains the units that have been globally enabled, 113 113 // with mutually exclusive units grouped together. 114 114 AllowedRepoUnitGroups = [][]Type{} 115 115 ) 116 116 117 + // DisabledRepoUnitsGet returns the globally disabled units, it is a quick patch to fix data-race during testing. 118 + // Because the queue worker might read when a test is mocking the value. FIXME: refactor to a clear solution later. 119 + func DisabledRepoUnitsGet() []Type { 120 + v := disabledRepoUnitsAtomic.Load() 121 + if v == nil { 122 + return nil 123 + } 124 + return *v 125 + } 126 + 127 + func DisabledRepoUnitsSet(v []Type) { 128 + disabledRepoUnitsAtomic.Store(&v) 129 + } 130 + 117 131 // Get valid set of default repository units from settings 118 132 func validateDefaultRepoUnits(defaultUnits, settingDefaultUnits []Type) []Type { 119 133 units := defaultUnits ··· 131 145 } 132 146 133 147 // Remove disabled units 134 - for _, disabledUnit := range DisabledRepoUnits { 148 + for _, disabledUnit := range DisabledRepoUnitsGet() { 135 149 for i, unit := range units { 136 150 if unit == disabledUnit { 137 151 units = append(units[:i], units[i+1:]...) ··· 144 158 145 159 // LoadUnitConfig load units from settings 146 160 func LoadUnitConfig() error { 147 - var invalidKeys []string 148 - DisabledRepoUnits, invalidKeys = FindUnitTypes(setting.Repository.DisabledRepoUnits...) 161 + disabledRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DisabledRepoUnits...) 149 162 if len(invalidKeys) > 0 { 150 163 log.Warn("Invalid keys in disabled repo units: %s", strings.Join(invalidKeys, ", ")) 151 164 } 165 + DisabledRepoUnitsSet(disabledRepoUnits) 152 166 153 167 setDefaultRepoUnits, invalidKeys := FindUnitTypes(setting.Repository.DefaultRepoUnits...) 154 168 if len(invalidKeys) > 0 { ··· 210 224 211 225 // UnitGlobalDisabled checks if unit type is global disabled 212 226 func (u Type) UnitGlobalDisabled() bool { 213 - for _, ud := range DisabledRepoUnits { 227 + for _, ud := range DisabledRepoUnitsGet() { 214 228 if u == ud { 215 229 return true 216 230 }
+12 -12
models/unit/unit_test.go
··· 14 14 func TestLoadUnitConfig(t *testing.T) { 15 15 t.Run("regular", func(t *testing.T) { 16 16 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { 17 - DisabledRepoUnits = disabledRepoUnits 17 + DisabledRepoUnitsSet(disabledRepoUnits) 18 18 DefaultRepoUnits = defaultRepoUnits 19 19 DefaultForkRepoUnits = defaultForkRepoUnits 20 - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) 20 + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) 21 21 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { 22 22 setting.Repository.DisabledRepoUnits = disabledRepoUnits 23 23 setting.Repository.DefaultRepoUnits = defaultRepoUnits ··· 28 28 setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls"} 29 29 setting.Repository.DefaultForkRepoUnits = []string{"repo.releases"} 30 30 assert.NoError(t, LoadUnitConfig()) 31 - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) 31 + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) 32 32 assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) 33 33 assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) 34 34 }) 35 35 t.Run("invalid", func(t *testing.T) { 36 36 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { 37 - DisabledRepoUnits = disabledRepoUnits 37 + DisabledRepoUnitsSet(disabledRepoUnits) 38 38 DefaultRepoUnits = defaultRepoUnits 39 39 DefaultForkRepoUnits = defaultForkRepoUnits 40 - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) 40 + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) 41 41 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { 42 42 setting.Repository.DisabledRepoUnits = disabledRepoUnits 43 43 setting.Repository.DefaultRepoUnits = defaultRepoUnits ··· 48 48 setting.Repository.DefaultRepoUnits = []string{"repo.code", "invalid.2", "repo.releases", "repo.issues", "repo.pulls"} 49 49 setting.Repository.DefaultForkRepoUnits = []string{"invalid.3", "repo.releases"} 50 50 assert.NoError(t, LoadUnitConfig()) 51 - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) 51 + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) 52 52 assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) 53 53 assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) 54 54 }) 55 55 t.Run("duplicate", func(t *testing.T) { 56 56 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { 57 - DisabledRepoUnits = disabledRepoUnits 57 + DisabledRepoUnitsSet(disabledRepoUnits) 58 58 DefaultRepoUnits = defaultRepoUnits 59 59 DefaultForkRepoUnits = defaultForkRepoUnits 60 - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) 60 + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) 61 61 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { 62 62 setting.Repository.DisabledRepoUnits = disabledRepoUnits 63 63 setting.Repository.DefaultRepoUnits = defaultRepoUnits ··· 68 68 setting.Repository.DefaultRepoUnits = []string{"repo.code", "repo.releases", "repo.issues", "repo.pulls", "repo.code"} 69 69 setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"} 70 70 assert.NoError(t, LoadUnitConfig()) 71 - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) 71 + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) 72 72 assert.Equal(t, []Type{TypeCode, TypeReleases, TypePullRequests}, DefaultRepoUnits) 73 73 assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) 74 74 }) 75 75 t.Run("empty_default", func(t *testing.T) { 76 76 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []Type) { 77 - DisabledRepoUnits = disabledRepoUnits 77 + DisabledRepoUnitsSet(disabledRepoUnits) 78 78 DefaultRepoUnits = defaultRepoUnits 79 79 DefaultForkRepoUnits = defaultForkRepoUnits 80 - }(DisabledRepoUnits, DefaultRepoUnits, DefaultForkRepoUnits) 80 + }(DisabledRepoUnitsGet(), DefaultRepoUnits, DefaultForkRepoUnits) 81 81 defer func(disabledRepoUnits, defaultRepoUnits, defaultForkRepoUnits []string) { 82 82 setting.Repository.DisabledRepoUnits = disabledRepoUnits 83 83 setting.Repository.DefaultRepoUnits = defaultRepoUnits ··· 88 88 setting.Repository.DefaultRepoUnits = []string{} 89 89 setting.Repository.DefaultForkRepoUnits = []string{"repo.releases", "repo.releases"} 90 90 assert.NoError(t, LoadUnitConfig()) 91 - assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnits) 91 + assert.Equal(t, []Type{TypeIssues}, DisabledRepoUnitsGet()) 92 92 assert.ElementsMatch(t, []Type{TypeCode, TypePullRequests, TypeReleases, TypeWiki, TypePackages, TypeProjects, TypeActions}, DefaultRepoUnits) 93 93 assert.Equal(t, []Type{TypeReleases}, DefaultForkRepoUnits) 94 94 })
+4 -2
tests/integration/org_project_test.go
··· 9 9 "testing" 10 10 11 11 unit_model "code.gitea.io/gitea/models/unit" 12 - "code.gitea.io/gitea/modules/test" 13 12 "code.gitea.io/gitea/tests" 14 13 ) 15 14 16 15 func TestOrgProjectAccess(t *testing.T) { 17 16 defer tests.PrepareTestEnv(t)() 18 - defer test.MockVariableValue(&unit_model.DisabledRepoUnits, append(slices.Clone(unit_model.DisabledRepoUnits), unit_model.TypeProjects))() 17 + 18 + disabledRepoUnits := unit_model.DisabledRepoUnitsGet() 19 + unit_model.DisabledRepoUnitsSet(append(slices.Clone(disabledRepoUnits), unit_model.TypeProjects)) 20 + defer unit_model.DisabledRepoUnitsSet(disabledRepoUnits) 19 21 20 22 // repo project, 404 21 23 req := NewRequest(t, "GET", "/user2/repo1/projects")