Backport #12939 Fix #12934 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
b62e13a001
commit
e9346fc4a9
2 changed files with 67 additions and 2 deletions
|
@ -4,8 +4,26 @@
|
||||||
|
|
||||||
package setting
|
package setting
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
// GetCronSettings maps the cron subsection to the provided config
|
// GetCronSettings maps the cron subsection to the provided config
|
||||||
func GetCronSettings(name string, config interface{}) (interface{}, error) {
|
func GetCronSettings(name string, config interface{}) (interface{}, error) {
|
||||||
err := Cfg.Section("cron." + name).MapTo(config)
|
if err := Cfg.Section("cron." + name).MapTo(config); err != nil {
|
||||||
return config, err
|
return config, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typ := reflect.TypeOf(config).Elem()
|
||||||
|
val := reflect.ValueOf(config).Elem()
|
||||||
|
|
||||||
|
for i := 0; i < typ.NumField(); i++ {
|
||||||
|
field := val.Field(i)
|
||||||
|
tpField := typ.Field(i)
|
||||||
|
if tpField.Type.Kind() == reflect.Struct && tpField.Anonymous {
|
||||||
|
if err := Cfg.Section("cron." + name).MapTo(field.Addr().Interface()); err != nil {
|
||||||
|
return config, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
47
modules/setting/cron_test.go
Normal file
47
modules/setting/cron_test.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package setting
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
ini "gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_GetCronSettings(t *testing.T) {
|
||||||
|
|
||||||
|
type BaseStruct struct {
|
||||||
|
Base bool
|
||||||
|
Second string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Extended struct {
|
||||||
|
BaseStruct
|
||||||
|
Extend bool
|
||||||
|
}
|
||||||
|
|
||||||
|
iniStr := `
|
||||||
|
[cron.test]
|
||||||
|
Base = true
|
||||||
|
Second = white rabbit
|
||||||
|
Extend = true
|
||||||
|
`
|
||||||
|
Cfg, _ = ini.Load([]byte(iniStr))
|
||||||
|
|
||||||
|
extended := &Extended{
|
||||||
|
BaseStruct: BaseStruct{
|
||||||
|
Second: "queen of hearts",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := GetCronSettings("test", extended)
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, extended.Base)
|
||||||
|
assert.EqualValues(t, extended.Second, "white rabbit")
|
||||||
|
assert.True(t, extended.Extend)
|
||||||
|
|
||||||
|
}
|
Reference in a new issue