diff --git a/modules/setting/config_provider.go b/modules/setting/config_provider.go index 86712792a7..d00164df9e 100644 --- a/modules/setting/config_provider.go +++ b/modules/setting/config_provider.go @@ -316,15 +316,14 @@ func mustMapSetting(rootCfg ConfigProvider, sectionName string, setting any) { } } +// DeprecatedWarnings contains the warning message for various deprecations, including: setting option, file/folder, etc +var DeprecatedWarnings []string + func deprecatedSetting(rootCfg ConfigProvider, oldSection, oldKey, newSection, newKey, version string) { if rootCfg.Section(oldSection).HasKey(oldKey) { - log.Error("Deprecated fallback `[%s]` `%s` present. Use `[%s]` `%s` instead. This fallback will be/has been removed in %s", oldSection, oldKey, newSection, newKey, version) - } -} - -func deprecatedSettingFatal(rootCfg ConfigProvider, oldSection, oldKey, newSection, newKey, version string) { - if rootCfg.Section(oldSection).HasKey(oldKey) { - log.Fatal("Deprecated fallback `[%s]` `%s` present. Use `[%s]` `%s` instead. This fallback will be/has been removed in %s. Shutting down", oldSection, oldKey, newSection, newKey, version) + 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) } } diff --git a/modules/setting/lfs.go b/modules/setting/lfs.go index 75463ce1e5..4232b5115b 100644 --- a/modules/setting/lfs.go +++ b/modules/setting/lfs.go @@ -34,7 +34,14 @@ func loadLFSFrom(rootCfg ConfigProvider) error { // Specifically default PATH to LFS_CONTENT_PATH // DEPRECATED should not be removed because users maybe upgrade from lower version to the latest version // if these are removed, the warning will not be shown - deprecatedSettingFatal(rootCfg, "server", "LFS_CONTENT_PATH", "lfs", "PATH", "v1.19.0") + deprecatedSetting(rootCfg, "server", "LFS_CONTENT_PATH", "lfs", "PATH", "v1.19.0") + + if val := sec.Key("LFS_CONTENT_PATH").String(); val != "" { + if lfsSec == nil { + lfsSec = rootCfg.Section("lfs") + } + lfsSec.Key("PATH").MustString(val) + } var err error LFS.Storage, err = getStorage(rootCfg, "lfs", "", lfsSec) diff --git a/modules/setting/lfs_test.go b/modules/setting/lfs_test.go index 3313cae0eb..10c54fec0a 100644 --- a/modules/setting/lfs_test.go +++ b/modules/setting/lfs_test.go @@ -21,6 +21,30 @@ func Test_getStorageInheritNameSectionTypeForLFS(t *testing.T) { assert.EqualValues(t, "minio", LFS.Storage.Type) assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) + iniStr = ` +[server] +LFS_CONTENT_PATH = path_ignored +[lfs] +PATH = path_used +` + cfg, err = NewConfigProviderFromData(iniStr) + assert.NoError(t, err) + assert.NoError(t, loadLFSFrom(cfg)) + + assert.EqualValues(t, "local", LFS.Storage.Type) + assert.Contains(t, LFS.Storage.Path, "path_used") + + iniStr = ` +[server] +LFS_CONTENT_PATH = deprecatedpath +` + cfg, err = NewConfigProviderFromData(iniStr) + assert.NoError(t, err) + assert.NoError(t, loadLFSFrom(cfg)) + + assert.EqualValues(t, "local", LFS.Storage.Type) + assert.Contains(t, LFS.Storage.Path, "deprecatedpath") + iniStr = ` [storage.lfs] STORAGE_TYPE = minio diff --git a/routers/web/admin/admin.go b/routers/web/admin/admin.go index 797ba8798d..3e050e6949 100644 --- a/routers/web/admin/admin.go +++ b/routers/web/admin/admin.go @@ -110,6 +110,16 @@ func updateSystemStatus() { 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) + } + ctx.Flash.Error(content, true) + } +} + // Dashboard show admin panel dashboard func Dashboard(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("admin.dashboard") @@ -120,6 +130,7 @@ func Dashboard(ctx *context.Context) { updateSystemStatus() ctx.Data["SysStatus"] = sysStatus ctx.Data["SSH"] = setting.SSH + prepareDeprecatedWarningsAlert(ctx) ctx.HTML(http.StatusOK, tplDashboard) } diff --git a/routers/web/admin/config.go b/routers/web/admin/config.go index b7d9976815..ba0d862645 100644 --- a/routers/web/admin/config.go +++ b/routers/web/admin/config.go @@ -171,6 +171,8 @@ func Config(ctx *context.Context) { ctx.Data["Loggers"] = log.GetManager().DumpLoggers() + prepareDeprecatedWarningsAlert(ctx) + ctx.HTML(http.StatusOK, tplConfig) } diff --git a/templates/admin/layout_head.tmpl b/templates/admin/layout_head.tmpl index 6d84f8f359..0974c5fbed 100644 --- a/templates/admin/layout_head.tmpl +++ b/templates/admin/layout_head.tmpl @@ -1,9 +1,11 @@ {{template "base/head" .ctxData}} <div role="main" aria-label="{{.ctxData.Title}}" class="page-content {{.pageClass}}"> - <div class="ui container stackable grid"> + <div class="ui container"> + {{template "base/alert" .ctxData}} + </div> + <div class="ui container admin-container"> {{template "admin/navbar" .ctxData}} - <div class="twelve wide column"> - {{template "base/alert" .ctxData}} + <div class="admin-main"> {{/* block: admin-setting-content */}} {{if false}}{{/* to make html structure "likely" complete to prevent IDE warnings */}} diff --git a/templates/admin/navbar.tmpl b/templates/admin/navbar.tmpl index 641d3fad81..a96e5c9367 100644 --- a/templates/admin/navbar.tmpl +++ b/templates/admin/navbar.tmpl @@ -1,4 +1,4 @@ -<div class="four wide column"> +<div class="admin-nav"> <div class="ui fluid vertical menu"> <div class="header item">{{.locale.Tr "settings"}}</div> <a class="{{if .PageIsAdminDashboard}}active {{end}}item" href="{{AppSubUrl}}/admin"> diff --git a/web_src/css/admin.css b/web_src/css/admin.css index 7e50b7f63d..1423b651dd 100644 --- a/web_src/css/admin.css +++ b/web_src/css/admin.css @@ -1,3 +1,26 @@ +.admin-container { + margin-top: 15px; + display: flex !important; + gap: 16px; +} + +.admin-nav { + width: 240px; +} + +.admin-main { + flex: 1; +} + +@media (max-width: 767.98px) { + .admin-container { + flex-direction: column; + } + .admin-nav { + width: auto; + } +} + .admin.hooks .list > .item:not(:first-child) { border-top: 1px solid var(--color-secondary); padding: 0.25rem 1rem;