]> source.dussan.org Git - gitea.git/commitdiff
Allow extended config on cron settings (#12939)
authorzeripath <art27@cantab.net>
Fri, 25 Sep 2020 08:58:09 +0000 (09:58 +0100)
committerGitHub <noreply@github.com>
Fri, 25 Sep 2020 08:58:09 +0000 (09:58 +0100)
* Allow extended config on cron settings

Fix #12934

Signed-off-by: Andrew Thornton <art27@cantab.net>
modules/setting/cron.go
modules/setting/cron_test.go [new file with mode: 0644]

index c8228ddaa87a9d2a6bbb6fb8352bdce5fdef26fd..9475887ecc7f5a62b2250c9dcebc625a74e4ed6d 100644 (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
 }
diff --git a/modules/setting/cron_test.go b/modules/setting/cron_test.go
new file mode 100644 (file)
index 0000000..8670a92
--- /dev/null
@@ -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)
+
+}