}
}
-// DeprecatedWarnings contains the warning message for various deprecations, including: setting option, file/folder, etc
-var DeprecatedWarnings []string
+// StartupProblems contains the messages for various startup problems, including: setting option, file/folder, etc
+var StartupProblems []string
+
+func logStartupProblem(skip int, level log.Level, format string, args ...any) {
+ msg := fmt.Sprintf(format, args...)
+ log.Log(skip+1, level, "%s", msg)
+ StartupProblems = append(StartupProblems, msg)
+}
func deprecatedSetting(rootCfg ConfigProvider, oldSection, oldKey, newSection, newKey, version string) {
if rootCfg.Section(oldSection).HasKey(oldKey) {
- msg := fmt.Sprintf("Deprecated config option `[%s]` `%s` present. Use `[%s]` `%s` instead. This fallback will be/has been removed in %s", oldSection, oldKey, newSection, newKey, version)
- log.Error("%v", msg)
- DeprecatedWarnings = append(DeprecatedWarnings, msg)
+ logStartupProblem(1, log.ERROR, "Deprecation: config option `[%s].%s` presents, please use `[%s].%s` instead because this fallback will be/has been removed in %s", oldSection, oldKey, newSection, newKey, version)
}
}
// deprecatedSettingDB add a hint that the configuration has been moved to database but still kept in app.ini
func deprecatedSettingDB(rootCfg ConfigProvider, oldSection, oldKey string) {
if rootCfg.Section(oldSection).HasKey(oldKey) {
- log.Error("Deprecated `[%s]` `%s` present which has been copied to database table sys_setting", oldSection, oldKey)
+ logStartupProblem(1, log.ERROR, "Deprecation: config option `[%s].%s` presents but it won't take effect because it has been moved to admin panel -> config setting", oldSection, oldKey)
}
}
if !filepath.IsAbs(Indexer.IssuePath) {
Indexer.IssuePath = filepath.ToSlash(filepath.Join(AppWorkPath, Indexer.IssuePath))
}
- checkOverlappedPath("indexer.ISSUE_INDEXER_PATH", Indexer.IssuePath)
+ checkOverlappedPath("[indexer].ISSUE_INDEXER_PATH", Indexer.IssuePath)
} else {
Indexer.IssueConnStr = sec.Key("ISSUE_INDEXER_CONN_STR").MustString(Indexer.IssueConnStr)
if Indexer.IssueType == "meilisearch" {
}
if generalSigningSecret.CompareAndSwap(old, &jwtSecret) {
// FIXME: in main branch, the signing token should be refactored (eg: one unique for LFS/OAuth2/etc ...)
- log.Warn("OAuth2 is not enabled, unable to use a persistent signing secret, a new one is generated, which is not persistent between restarts and cluster nodes")
+ logStartupProblem(1, log.WARN, "OAuth2 is not enabled, unable to use a persistent signing secret, a new one is generated, which is not persistent between restarts and cluster nodes")
return jwtSecret
}
return *generalSigningSecret.Load()
RepoRootPath = filepath.Clean(RepoRootPath)
}
- checkOverlappedPath("repository.ROOT", RepoRootPath)
+ checkOverlappedPath("[repository].ROOT", RepoRootPath)
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
for _, charset := range Repository.DetectedCharsetsOrder {
if !filepath.IsAbs(PprofDataPath) {
PprofDataPath = filepath.Join(AppWorkPath, PprofDataPath)
}
- checkOverlappedPath("server.PPROF_DATA_PATH", PprofDataPath)
+ checkOverlappedPath("[server].PPROF_DATA_PATH", PprofDataPath)
landingPage := sec.Key("LANDING_PAGE").MustString("home")
switch landingPage {
SessionConfig.ProviderConfig = strings.Trim(sec.Key("PROVIDER_CONFIG").MustString(filepath.Join(AppDataPath, "sessions")), "\" ")
if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) {
SessionConfig.ProviderConfig = filepath.Join(AppWorkPath, SessionConfig.ProviderConfig)
- checkOverlappedPath("session.PROVIDER_CONFIG", SessionConfig.ProviderConfig)
+ checkOverlappedPath("[session].PROVIDER_CONFIG", SessionConfig.ProviderConfig)
}
SessionConfig.CookieName = sec.Key("COOKIE_NAME").MustString("i_like_gitea")
SessionConfig.CookiePath = AppSubURL
func checkOverlappedPath(name, path string) {
// TODO: some paths shouldn't overlap (storage.xxx.path), while some could (data path is the base path for storage path)
if targetName, ok := configuredPaths[path]; ok && targetName != name {
- msg := fmt.Sprintf("Configured path %q is used by %q and %q at the same time. The paths must be unique to prevent data loss.", path, targetName, name)
- log.Error("%s", msg)
- DeprecatedWarnings = append(DeprecatedWarnings, msg)
+ logStartupProblem(1, log.ERROR, "Configured path %q is used by %q and %q at the same time. The paths must be unique to prevent data loss.", path, targetName, name)
}
configuredPaths[path] = name
}
}
}
- checkOverlappedPath("storage."+name+".PATH", storage.Path)
+ checkOverlappedPath("[storage."+name+"].PATH", storage.Path)
return &storage, nil
}
sysStatus.NumGC = m.NumGC
}
-func prepareDeprecatedWarningsAlert(ctx *context.Context) {
- if len(setting.DeprecatedWarnings) > 0 {
- content := setting.DeprecatedWarnings[0]
- if len(setting.DeprecatedWarnings) > 1 {
- content += fmt.Sprintf(" (and %d more)", len(setting.DeprecatedWarnings)-1)
+func prepareStartupProblemsAlert(ctx *context.Context) {
+ if len(setting.StartupProblems) > 0 {
+ content := setting.StartupProblems[0]
+ if len(setting.StartupProblems) > 1 {
+ content += fmt.Sprintf(" (and %d more)", len(setting.StartupProblems)-1)
}
ctx.Flash.Error(content, true)
}
updateSystemStatus()
ctx.Data["SysStatus"] = sysStatus
ctx.Data["SSH"] = setting.SSH
- prepareDeprecatedWarningsAlert(ctx)
+ prepareStartupProblemsAlert(ctx)
ctx.HTML(http.StatusOK, tplDashboard)
}
func SelfCheck(ctx *context.Context) {
ctx.Data["PageIsAdminSelfCheck"] = true
- ctx.Data["DeprecatedWarnings"] = setting.DeprecatedWarnings
- if len(setting.DeprecatedWarnings) == 0 && !setting.IsProd {
+ ctx.Data["StartupProblems"] = setting.StartupProblems
+ if len(setting.StartupProblems) == 0 && !setting.IsProd {
if time.Now().Unix()%2 == 0 {
- ctx.Data["DeprecatedWarnings"] = []string{"This is a test warning message in dev mode"}
+ ctx.Data["StartupProblems"] = []string{"This is a test warning message in dev mode"}
}
}
ctx.Data["Loggers"] = log.GetManager().DumpLoggers()
config.GetDynGetter().InvalidateCache()
- prepareDeprecatedWarningsAlert(ctx)
+ prepareStartupProblemsAlert(ctx)
ctx.HTML(http.StatusOK, tplConfig)
}
{{ctx.Locale.Tr "admin.self_check"}}
</h4>
- {{if .DeprecatedWarnings}}
+ {{if .StartupProblems}}
<div class="ui attached segment">
<div class="ui warning message">
<div>{{ctx.Locale.Tr "admin.self_check.startup_warnings"}}</div>
- <ul class="tw-w-full">{{range .DeprecatedWarnings}}<li>{{.}}</li>{{end}}</ul>
+ <ul class="tw-w-full">{{range .StartupProblems}}<li>{{.}}</li>{{end}}</ul>
</div>
</div>
{{end}}
</div>
{{end}}
- {{if and (not .DeprecatedWarnings) (not .DatabaseCheckHasProblems)}}
+ {{if and (not .StartupProblems) (not .DatabaseCheckHasProblems)}}
<div class="ui attached segment">
{{ctx.Locale.Tr "admin.self_check.no_problem_found"}}
</div>