Allow extended config on cron settings (#12939)

* Allow extended config on cron settings

Fix #12934

Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
zeripath 2020-09-25 09:58:09 +01:00 committed by GitHub
parent 3c360801b3
commit f1ab1c532b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 2 deletions

View file

@ -4,8 +4,26 @@
package setting
import "reflect"
// GetCronSettings maps the cron subsection to the provided config
func GetCronSettings(name string, config interface{}) (interface{}, error) {
err := Cfg.Section("cron." + name).MapTo(config)
return config, err
if err := Cfg.Section("cron." + name).MapTo(config); err != nil {
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
}

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