From 526f4aadd0f88d2d4ce70b10cecc5d5ae27807a3 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 24 Sep 2020 22:16:22 +0100 Subject: [PATCH 1/2] Allow extended config on cron settings Fix #12934 Signed-off-by: Andrew Thornton --- modules/setting/cron.go | 22 ++++++++++++++++-- modules/setting/cron_test.go | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 modules/setting/cron_test.go diff --git a/modules/setting/cron.go b/modules/setting/cron.go index c8228ddaa87a..9475887ecc7f 100644 --- a/modules/setting/cron.go +++ b/modules/setting/cron.go @@ -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 } diff --git a/modules/setting/cron_test.go b/modules/setting/cron_test.go new file mode 100644 index 000000000000..e2e383bee2a0 --- /dev/null +++ b/modules/setting/cron_test.go @@ -0,0 +1,43 @@ +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) + +} From a5c4a868c210f53a8a68267d1d1babc1cef109b5 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 24 Sep 2020 22:28:39 +0100 Subject: [PATCH 2/2] I HATE YOU GOLANGCI-LINT Signed-off-by: Andrew Thornton --- modules/setting/cron_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/setting/cron_test.go b/modules/setting/cron_test.go index e2e383bee2a0..8670a92bac96 100644 --- a/modules/setting/cron_test.go +++ b/modules/setting/cron_test.go @@ -1,3 +1,7 @@ +// 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 (