fix(setting): honor bare -1 for timeout settings (#39181)

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
aminoy
2026-08-31 19:48:59 +00:00
committed by GitHub
co-authored by wxiaoguang
parent 70678e9a3d
commit fc9800b383
12 changed files with 130 additions and 58 deletions
+62 -5
View File
@@ -19,15 +19,22 @@ import (
)
type ConfigKey interface {
internal()
Name() string
Value() string
SetValue(v string)
In(defaultVal string, candidates []string) string
String() string
Strings(delim string) []string
Bool() (bool, error)
// FIXME: INI-MUST-SIDE-EFFECT: ini package's In/MustXxx functions have bad side-effects:
// they will change the origin config content and write the key with default value if the key didn't exist.
// Need to completely refactor the ini package to remove this side-effect.
In(defaultVal string, candidates []string) string
MustString(defaultVal string) string
MustBool(defaultVal ...bool) bool
MustInt(defaultVal ...int) int
@@ -73,10 +80,56 @@ type iniConfigSection struct {
sec *ini.Section
}
type iniConfigKey struct {
key *ini.Key
}
func (k *iniConfigKey) internal() {}
func (k *iniConfigKey) Name() string { return k.key.Name() }
func (k *iniConfigKey) Value() string { return k.key.Value() }
func (k *iniConfigKey) SetValue(v string) { k.key.SetValue(v) }
func (k *iniConfigKey) String() string { return k.key.String() }
func (k *iniConfigKey) Strings(delim string) []string { return k.key.Strings(delim) }
func (k *iniConfigKey) Bool() (bool, error) { return k.key.Bool() }
func (k *iniConfigKey) MustString(defaultVal string) string { return k.key.MustString(defaultVal) }
func (k *iniConfigKey) MustBool(defaultVal ...bool) bool { return k.key.MustBool(defaultVal...) }
func (k *iniConfigKey) MustInt(defaultVal ...int) int { return k.key.MustInt(defaultVal...) }
func (k *iniConfigKey) MustInt64(defaultVal ...int64) int64 { return k.key.MustInt64(defaultVal...) }
func (k *iniConfigKey) In(defaultVal string, candidates []string) string {
return k.key.In(defaultVal, candidates)
}
func (k *iniConfigKey) MustDuration(defaultVal ...time.Duration) time.Duration {
s := k.String()
v, err := strconv.ParseInt(s, 10, 64)
if err == nil {
d := time.Duration(v) * time.Second
k.key.SetValue(d.String())
return d
}
d, err := time.ParseDuration(s)
if err != nil {
d = util.OptionalArg(defaultVal)
}
k.key.SetValue(d.String())
return d
}
var (
_ ConfigProvider = (*iniConfigProvider)(nil)
_ ConfigSection = (*iniConfigSection)(nil)
_ ConfigKey = (*ini.Key)(nil)
_ ConfigKey = (*iniConfigKey)(nil)
)
// ConfigSectionKey only searches the keys in the given section, but it is O(n).
@@ -156,16 +209,20 @@ func (s *iniConfigSection) HasKey(key string) bool {
}
func (s *iniConfigSection) NewKey(name, value string) (ConfigKey, error) {
return s.sec.NewKey(name, value)
k, err := s.sec.NewKey(name, value)
if err != nil {
return nil, err
}
return &iniConfigKey{k}, nil
}
func (s *iniConfigSection) Key(key string) ConfigKey {
return s.sec.Key(key)
return &iniConfigKey{s.sec.Key(key)}
}
func (s *iniConfigSection) Keys() (keys []ConfigKey) {
for _, k := range s.sec.Keys() {
keys = append(keys, k)
keys = append(keys, &iniConfigKey{k})
}
return keys
}
+13
View File
@@ -6,6 +6,7 @@ package setting
import (
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
@@ -136,3 +137,15 @@ func TestDisableSaving(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, "k1 = a\nk2 = y\nk3 = z\n", string(bs))
}
func TestConfigValueRead(t *testing.T) {
cfg, _ := NewConfigProviderFromData(`
neg = -1
zero = 0
hour = 1h
`)
assert.Equal(t, -1*time.Second, cfg.Section("").Key("neg").MustDuration(9999))
assert.EqualValues(t, 0, cfg.Section("").Key("zero").MustDuration(9999))
assert.Equal(t, time.Hour, cfg.Section("").Key("hour").MustDuration(9999))
assert.Equal(t, time.Duration(9999), cfg.Section("").Key("def").MustDuration(9999))
}
+1 -1
View File
@@ -49,7 +49,7 @@ func loadLFSFrom(rootCfg ConfigProvider) error {
if lfsSec == nil {
lfsSec = rootCfg.Section("lfs")
}
lfsSec.Key("PATH").MustString(val)
lfsSec.Key("PATH").MustString(val) // FIXME: INI-MUST-SIDE-EFFECT
}
var err error
+8 -6
View File
@@ -56,13 +56,13 @@ func prepareLoggerConfig(rootCfg ConfigProvider) {
sec := rootCfg.Section("log")
if !sec.HasKey("logger.default.MODE") {
sec.Key("logger.default.MODE").MustString(",")
sec.Key("logger.default.MODE").MustString(",") // FIXME: INI-MUST-SIDE-EFFECT
}
deprecatedSetting(rootCfg, "log", "ACCESS", "log", "logger.access.MODE", "1.21")
deprecatedSetting(rootCfg, "log", "ENABLE_ACCESS_LOG", "log", "logger.access.MODE", "1.21")
if val := sec.Key("ACCESS").String(); val != "" {
sec.Key("logger.access.MODE").MustString(val)
sec.Key("logger.access.MODE").MustString(val) // FIXME: INI-MUST-SIDE-EFFECT
}
if sec.HasKey("ENABLE_ACCESS_LOG") && !sec.Key("ENABLE_ACCESS_LOG").MustBool() {
sec.Key("logger.access.MODE").SetValue("")
@@ -71,10 +71,11 @@ func prepareLoggerConfig(rootCfg ConfigProvider) {
deprecatedSetting(rootCfg, "log", "ROUTER", "log", "logger.router.MODE", "1.21")
deprecatedSetting(rootCfg, "log", "DISABLE_ROUTER_LOG", "log", "logger.router.MODE", "1.21")
if val := sec.Key("ROUTER").String(); val != "" {
sec.Key("logger.router.MODE").MustString(val)
sec.Key("logger.router.MODE").MustString(val) // FIXME: INI-MUST-SIDE-EFFECT
}
if !sec.HasKey("logger.router.MODE") {
sec.Key("logger.router.MODE").MustString(",") // use default logger
// Use the default logger.
sec.Key("logger.router.MODE").MustString(",") // FIXME: INI-MUST-SIDE-EFFECT
}
if sec.HasKey("DISABLE_ROUTER_LOG") && sec.Key("DISABLE_ROUTER_LOG").MustBool() {
sec.Key("logger.router.MODE").SetValue("")
@@ -83,10 +84,11 @@ func prepareLoggerConfig(rootCfg ConfigProvider) {
deprecatedSetting(rootCfg, "log", "XORM", "log", "logger.xorm.MODE", "1.21")
deprecatedSetting(rootCfg, "log", "ENABLE_XORM_LOG", "log", "logger.xorm.MODE", "1.21")
if val := sec.Key("XORM").String(); val != "" {
sec.Key("logger.xorm.MODE").MustString(val)
sec.Key("logger.xorm.MODE").MustString(val) // FIXME: INI-MUST-SIDE-EFFECT
}
if !sec.HasKey("logger.xorm.MODE") {
sec.Key("logger.xorm.MODE").MustString(",") // use default logger
// Use the default logger.
sec.Key("logger.xorm.MODE").MustString(",") // FIXME: INI-MUST-SIDE-EFFECT
}
if sec.HasKey("ENABLE_XORM_LOG") && !sec.Key("ENABLE_XORM_LOG").MustBool() {
sec.Key("logger.xorm.MODE").SetValue("")
+17 -17
View File
@@ -79,7 +79,7 @@ func loadMailerFrom(rootCfg ConfigProvider) {
deprecatedSetting(rootCfg, "mailer", "MAILER_TYPE", "mailer", "PROTOCOL", "v1.19.0")
if sec.HasKey("MAILER_TYPE") && !sec.HasKey("PROTOCOL") {
if sec.Key("MAILER_TYPE").String() == "sendmail" {
sec.Key("PROTOCOL").MustString("sendmail")
sec.Key("PROTOCOL").MustString("sendmail") // FIXME: INI-MUST-SIDE-EFFECT
}
}
@@ -95,32 +95,32 @@ func loadMailerFrom(rootCfg ConfigProvider) {
if addr == "" {
addr = "127.0.0.1"
}
sec.Key("SMTP_ADDR").MustString(addr)
sec.Key("SMTP_PORT").MustString(port)
sec.Key("SMTP_ADDR").MustString(addr) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("SMTP_PORT").MustString(port) // FIXME: INI-MUST-SIDE-EFFECT
}
deprecatedSetting(rootCfg, "mailer", "IS_TLS_ENABLED", "mailer", "PROTOCOL", "v1.19.0")
if sec.HasKey("IS_TLS_ENABLED") && !sec.HasKey("PROTOCOL") {
if sec.Key("IS_TLS_ENABLED").MustBool() {
sec.Key("PROTOCOL").MustString("smtps")
sec.Key("PROTOCOL").MustString("smtps") // FIXME: INI-MUST-SIDE-EFFECT
} else {
sec.Key("PROTOCOL").MustString("smtp+starttls")
sec.Key("PROTOCOL").MustString("smtp+starttls") // FIXME: INI-MUST-SIDE-EFFECT
}
}
deprecatedSetting(rootCfg, "mailer", "DISABLE_HELO", "mailer", "ENABLE_HELO", "v1.19.0")
if sec.HasKey("DISABLE_HELO") && !sec.HasKey("ENABLE_HELO") {
sec.Key("ENABLE_HELO").MustBool(!sec.Key("DISABLE_HELO").MustBool())
sec.Key("ENABLE_HELO").MustBool(!sec.Key("DISABLE_HELO").MustBool()) // FIXME: INI-MUST-SIDE-EFFECT
}
deprecatedSetting(rootCfg, "mailer", "SKIP_VERIFY", "mailer", "FORCE_TRUST_SERVER_CERT", "v1.19.0")
if sec.HasKey("SKIP_VERIFY") && !sec.HasKey("FORCE_TRUST_SERVER_CERT") {
sec.Key("FORCE_TRUST_SERVER_CERT").MustBool(sec.Key("SKIP_VERIFY").MustBool())
sec.Key("FORCE_TRUST_SERVER_CERT").MustBool(sec.Key("SKIP_VERIFY").MustBool()) // FIXME: INI-MUST-SIDE-EFFECT
}
deprecatedSetting(rootCfg, "mailer", "USE_CERTIFICATE", "mailer", "USE_CLIENT_CERT", "v1.19.0")
if sec.HasKey("USE_CERTIFICATE") && !sec.HasKey("USE_CLIENT_CERT") {
sec.Key("USE_CLIENT_CERT").MustBool(sec.Key("USE_CERTIFICATE").MustBool())
sec.Key("USE_CLIENT_CERT").MustBool(sec.Key("USE_CERTIFICATE").MustBool()) // FIXME: INI-MUST-SIDE-EFFECT
}
deprecatedSetting(rootCfg, "mailer", "CERT_FILE", "mailer", "CLIENT_CERT_FILE", "v1.19.0")
@@ -135,7 +135,7 @@ func loadMailerFrom(rootCfg ConfigProvider) {
deprecatedSetting(rootCfg, "mailer", "ENABLE_HTML_ALTERNATIVE", "mailer", "SEND_AS_PLAIN_TEXT", "v1.19.0")
if sec.HasKey("ENABLE_HTML_ALTERNATIVE") && !sec.HasKey("SEND_AS_PLAIN_TEXT") {
sec.Key("SEND_AS_PLAIN_TEXT").MustBool(!sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(false))
sec.Key("SEND_AS_PLAIN_TEXT").MustBool(!sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(false)) // FIXME: INI-MUST-SIDE-EFFECT
}
if sec.HasKey("PROTOCOL") && sec.Key("PROTOCOL").String() == "smtp+startls" {
@@ -144,15 +144,15 @@ func loadMailerFrom(rootCfg ConfigProvider) {
}
// Set default values & validate
sec.Key("NAME").MustString(AppName)
sec.Key("NAME").MustString(AppName) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("PROTOCOL").In("", []string{"smtp", "smtps", "smtp+starttls", "smtp+unix", "sendmail", "dummy"})
sec.Key("ENABLE_HELO").MustBool(true)
sec.Key("FORCE_TRUST_SERVER_CERT").MustBool(false)
sec.Key("USE_CLIENT_CERT").MustBool(false)
sec.Key("SENDMAIL_PATH").MustString("sendmail")
sec.Key("SENDMAIL_TIMEOUT").MustDuration(5 * time.Minute)
sec.Key("SENDMAIL_CONVERT_CRLF").MustBool(true)
sec.Key("FROM").MustString(sec.Key("USER").String())
sec.Key("ENABLE_HELO").MustBool(true) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("FORCE_TRUST_SERVER_CERT").MustBool(false) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("USE_CLIENT_CERT").MustBool(false) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("SENDMAIL_PATH").MustString("sendmail") // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("SENDMAIL_TIMEOUT").MustDuration(5 * time.Minute) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("SENDMAIL_CONVERT_CRLF").MustBool(true) // FIXME: INI-MUST-SIDE-EFFECT
sec.Key("FROM").MustString(sec.Key("USER").String()) // FIXME: INI-MUST-SIDE-EFFECT
// Now map the values on to the MailService
MailService = &Mailer{}
+2 -2
View File
@@ -38,7 +38,7 @@ func loadAvatarsFrom(rootCfg ConfigProvider) error {
avatarSec := rootCfg.Section("avatar")
storageType := sec.Key("AVATAR_STORAGE_TYPE").MustString("")
// Specifically default PATH to AVATAR_UPLOAD_PATH
avatarSec.Key("PATH").MustString(sec.Key("AVATAR_UPLOAD_PATH").String())
avatarSec.Key("PATH").MustString(sec.Key("AVATAR_UPLOAD_PATH").String()) // FIXME: INI-MUST-SIDE-EFFECT
var err error
Avatar.Storage, err = getStorage(rootCfg, "avatars", storageType, avatarSec)
@@ -73,7 +73,7 @@ func loadRepoAvatarFrom(rootCfg ConfigProvider) error {
repoAvatarSec := rootCfg.Section("repo-avatar")
storageType := sec.Key("REPOSITORY_AVATAR_STORAGE_TYPE").MustString("")
// Specifically default PATH to AVATAR_UPLOAD_PATH
repoAvatarSec.Key("PATH").MustString(sec.Key("REPOSITORY_AVATAR_UPLOAD_PATH").String())
repoAvatarSec.Key("PATH").MustString(sec.Key("REPOSITORY_AVATAR_UPLOAD_PATH").String()) // FIXME: INI-MUST-SIDE-EFFECT
var err error
RepoAvatar.Storage, err = getStorage(rootCfg, "repo-avatars", storageType, repoAvatarSec)
+3 -3
View File
@@ -306,9 +306,9 @@ func loadRepositoryFrom(rootCfg ConfigProvider) {
Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https")
// MAX_CREATION_LIMIT is a shortcut that sets the default for the two per-type limits below.
// USER_/ORG_MAX_CREATION_LIMIT take precedence when explicitly set.
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
Repository.UserMaxCreationLimit = sec.Key("USER_MAX_CREATION_LIMIT").MustInt(Repository.MaxCreationLimit)
Repository.OrgMaxCreationLimit = sec.Key("ORG_MAX_CREATION_LIMIT").MustInt(Repository.MaxCreationLimit)
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) // FIXME: INI-MUST-SIDE-EFFECT
Repository.UserMaxCreationLimit = sec.Key("USER_MAX_CREATION_LIMIT").MustInt(Repository.MaxCreationLimit) // FIXME: INI-MUST-SIDE-EFFECT
Repository.OrgMaxCreationLimit = sec.Key("ORG_MAX_CREATION_LIMIT").MustInt(Repository.MaxCreationLimit) // FIXME: INI-MUST-SIDE-EFFECT
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
RepoRootPath = sec.Key("ROOT").MustString(filepath.Join(AppDataPath, "gitea-repositories"))
if !filepath.IsAbs(RepoRootPath) {
+1 -1
View File
@@ -244,7 +244,7 @@ func loadServiceFrom(rootCfg ConfigProvider) {
Service.DefaultOrgMemberVisible = sec.Key("DEFAULT_ORG_MEMBER_VISIBLE").MustBool()
Service.UserDeleteWithCommentsMaxTime = sec.Key("USER_DELETE_WITH_COMMENTS_MAX_TIME").MustDuration(0)
sec.Key("VALID_SITE_URL_SCHEMES").MustString("http,https")
sec.Key("VALID_SITE_URL_SCHEMES").MustString("http,https") // FIXME: INI-MUST-SIDE-EFFECT
Service.ValidSiteURLSchemes = sec.Key("VALID_SITE_URL_SCHEMES").Strings(",")
schemes := make([]string, 0, len(Service.ValidSiteURLSchemes))
for _, scheme := range Service.ValidSiteURLSchemes {
+3 -3
View File
@@ -146,9 +146,9 @@ func loadSSHFrom(rootCfg ConfigProvider) {
}
if len(SSH.TrustedUserCAKeys) > 0 {
// Set the default as email,username otherwise we can leave it empty
sec.Key("SSH_AUTHORIZED_PRINCIPALS_ALLOW").MustString("username,email")
sec.Key("SSH_AUTHORIZED_PRINCIPALS_ALLOW").MustString("username,email") // FIXME: INI-MUST-SIDE-EFFECT
} else {
sec.Key("SSH_AUTHORIZED_PRINCIPALS_ALLOW").MustString("off")
sec.Key("SSH_AUTHORIZED_PRINCIPALS_ALLOW").MustString("off") // FIXME: INI-MUST-SIDE-EFFECT
}
SSH.AuthorizedPrincipalsAllow, SSH.AuthorizedPrincipalsEnabled = parseAuthorizedPrincipalsAllow(sec.Key("SSH_AUTHORIZED_PRINCIPALS_ALLOW").Strings(","))
@@ -156,7 +156,7 @@ func loadSSHFrom(rootCfg ConfigProvider) {
SSH.MinimumKeySizeCheck = sec.Key("MINIMUM_KEY_SIZE_CHECK").MustBool(SSH.MinimumKeySizeCheck)
minimumKeySizes := rootCfg.Section("ssh.minimum_key_sizes").Keys()
for _, key := range minimumKeySizes {
if key.MustInt() != -1 {
if key.MustInt() != -1 { // FIXME: INI-MUST-SIDE-EFFECT
SSH.MinimumKeySizes[strings.ToLower(key.Name())] = key.MustInt()
} else {
delete(SSH.MinimumKeySizes, strings.ToLower(key.Name()))
+14 -14
View File
@@ -104,20 +104,20 @@ const storageSectionName = "storage"
func getDefaultStorageSection(rootCfg ConfigProvider) ConfigSection {
storageSec := rootCfg.Section(storageSectionName)
// Global Defaults
storageSec.Key("STORAGE_TYPE").MustString("local")
storageSec.Key("MINIO_ENDPOINT").MustString("localhost:9000")
storageSec.Key("MINIO_ACCESS_KEY_ID").MustString("")
storageSec.Key("MINIO_SECRET_ACCESS_KEY").MustString("")
storageSec.Key("MINIO_BUCKET").MustString("gitea")
storageSec.Key("MINIO_LOCATION").MustString("us-east-1")
storageSec.Key("MINIO_USE_SSL").MustBool(false)
storageSec.Key("MINIO_INSECURE_SKIP_VERIFY").MustBool(false)
storageSec.Key("MINIO_CHECKSUM_ALGORITHM").MustString("default")
storageSec.Key("MINIO_BUCKET_LOOKUP_TYPE").MustString("auto")
storageSec.Key("AZURE_BLOB_ENDPOINT").MustString("")
storageSec.Key("AZURE_BLOB_ACCOUNT_NAME").MustString("")
storageSec.Key("AZURE_BLOB_ACCOUNT_KEY").MustString("")
storageSec.Key("AZURE_BLOB_CONTAINER").MustString("gitea")
storageSec.Key("STORAGE_TYPE").MustString("local") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_ENDPOINT").MustString("localhost:9000") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_ACCESS_KEY_ID").MustString("") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_SECRET_ACCESS_KEY").MustString("") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_BUCKET").MustString("gitea") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_LOCATION").MustString("us-east-1") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_USE_SSL").MustBool(false) // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_INSECURE_SKIP_VERIFY").MustBool(false) // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_CHECKSUM_ALGORITHM").MustString("default") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("MINIO_BUCKET_LOOKUP_TYPE").MustString("auto") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("AZURE_BLOB_ENDPOINT").MustString("") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("AZURE_BLOB_ACCOUNT_NAME").MustString("") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("AZURE_BLOB_ACCOUNT_KEY").MustString("") // FIXME: INI-MUST-SIDE-EFFECT
storageSec.Key("AZURE_BLOB_CONTAINER").MustString("gitea") // FIXME: INI-MUST-SIDE-EFFECT
return storageSec
}
+5 -5
View File
@@ -16,11 +16,11 @@ func loadTaskFrom(rootCfg ConfigProvider) {
switch taskSec.Key("QUEUE_TYPE").MustString("channel") {
case "channel":
queueTaskSec.Key("TYPE").MustString("persistable-channel")
queueTaskSec.Key("CONN_STR").MustString(taskSec.Key("QUEUE_CONN_STR").MustString(""))
queueTaskSec.Key("TYPE").MustString("persistable-channel") // FIXME: INI-MUST-SIDE-EFFECT
queueTaskSec.Key("CONN_STR").MustString(taskSec.Key("QUEUE_CONN_STR").MustString("")) // FIXME: INI-MUST-SIDE-EFFECT
case "redis":
queueTaskSec.Key("TYPE").MustString("redis")
queueTaskSec.Key("CONN_STR").MustString(taskSec.Key("QUEUE_CONN_STR").MustString("addrs=127.0.0.1:6379 db=0"))
queueTaskSec.Key("TYPE").MustString("redis") // FIXME: INI-MUST-SIDE-EFFECT
queueTaskSec.Key("CONN_STR").MustString(taskSec.Key("QUEUE_CONN_STR").MustString("addrs=127.0.0.1:6379 db=0")) // FIXME: INI-MUST-SIDE-EFFECT
}
queueTaskSec.Key("LENGTH").MustInt(taskSec.Key("QUEUE_LENGTH").MustInt(1000))
queueTaskSec.Key("LENGTH").MustInt(taskSec.Key("QUEUE_LENGTH").MustInt(1000)) // FIXME: INI-MUST-SIDE-EFFECT
}
+1 -1
View File
@@ -403,7 +403,7 @@ func fillInstallConfig(ctx *context.Context, envs []string, form *forms.InstallF
cfg.Section("session").Key("PROVIDER").SetValue("file")
cfg.Section("log").Key("MODE").MustString("console")
cfg.Section("log").Key("MODE").MustString("console") // FIXME: INI-MUST-SIDE-EFFECT
cfg.Section("log").Key("LEVEL").SetValue(setting.Log.Level.String())
cfg.Section("log").Key("ROOT_PATH").SetValue(form.LogRootPath)