detached c1c32b5

fix: remove old section defaults so migrate diff shows correct direction

Old sections (rendering, performance, privacy, runtime) were still registered
as viper defaults, causing `dumber config migrate` to show them as "new"
after migration. Since checkLegacyFormat() blocks loading with old sections,
users must migrate first — old defaults are no longer needed.

Kept: media defaults for non-migrated fields (hardware_decoding, prefer_av1,
show_diagnostics). Moved default_webpage_zoom/default_ui_scale to their own
setter since they're top-level keys unrelated to the engine migration.
commit
c1c32b5bc3eb358dcdd4945c43818f8058ac8d34
author
brice · · 2026-03-15 19:53 UTC
parent
4afa706
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
2 files · +25 -50
M internal/infrastructure/config/loader.go +6 -47
@@ -429,17 +429,14 @@ func (m *Manager) setDefaults() {
429429 m.setDebugDefaults(defaults)
430430 m.setAppearanceDefaults(defaults)
431431 m.setEngineDefaults(defaults)
432- m.setRenderingDefaults(defaults)
433- m.setPrivacyDefaults(defaults)
432+ m.setZoomAndScaleDefaults(defaults)
434433 m.setWorkspaceDefaults(defaults)
435434 m.setContentFilteringDefaults(defaults)
436435 m.setClipboardDefaults(defaults)
437436 m.setOmniboxDefaults(defaults)
438437 m.setMediaDefaults(defaults)
439- m.setRuntimeDefaults(defaults)
440438 m.setSessionDefaults(defaults)
441439 m.setUpdateDefaults(defaults)
442- m.setPerformanceDefaults(defaults)
443440 m.setDownloadsDefaults(defaults)
444441 }
445442
@@ -489,27 +486,11 @@ func (m *Manager) setAppearanceDefaults(defaults *Config) {
489486 m.viper.SetDefault("appearance.color_scheme", defaults.Appearance.ColorScheme)
490487 }
491488
492-func (m *Manager) setRenderingDefaults(defaults *Config) {
493- m.viper.SetDefault("rendering.mode", string(defaults.Rendering.Mode))
494- m.viper.SetDefault("rendering.disable_dmabuf_renderer", defaults.Rendering.DisableDMABufRenderer)
495- m.viper.SetDefault("rendering.force_compositing_mode", defaults.Rendering.ForceCompositingMode)
496- m.viper.SetDefault("rendering.disable_compositing_mode", defaults.Rendering.DisableCompositingMode)
497- m.viper.SetDefault("rendering.gsk_renderer", string(defaults.Rendering.GSKRenderer))
498- m.viper.SetDefault("rendering.disable_mipmaps", defaults.Rendering.DisableMipmaps)
499- m.viper.SetDefault("rendering.prefer_gl", defaults.Rendering.PreferGL)
500- m.viper.SetDefault("rendering.draw_compositing_indicators", defaults.Rendering.DrawCompositingIndicators)
501- m.viper.SetDefault("rendering.show_fps", defaults.Rendering.ShowFPS)
502- m.viper.SetDefault("rendering.sample_memory", defaults.Rendering.SampleMemory)
503- m.viper.SetDefault("rendering.debug_frames", defaults.Rendering.DebugFrames)
489+func (m *Manager) setZoomAndScaleDefaults(defaults *Config) {
504490 m.viper.SetDefault("default_webpage_zoom", defaults.DefaultWebpageZoom)
505491 m.viper.SetDefault("default_ui_scale", defaults.DefaultUIScale)
506492 }
507493
508-func (m *Manager) setPrivacyDefaults(defaults *Config) {
509- m.viper.SetDefault("privacy.cookie_policy", string(defaults.Privacy.CookiePolicy))
510- m.viper.SetDefault("privacy.itp_enabled", defaults.Privacy.ITPEnabled)
511-}
512-
513494 func (m *Manager) setWorkspaceDefaults(defaults *Config) {
514495 m.viper.SetDefault("workspace.new_pane_url", defaults.Workspace.NewPaneURL)
515496 m.viper.SetDefault("workspace.pane_mode.activation_shortcut", defaults.Workspace.PaneMode.ActivationShortcut)
@@ -563,17 +544,14 @@ func (m *Manager) setOmniboxDefaults(defaults *Config) {
563544 }
564545
565546 func (m *Manager) setMediaDefaults(defaults *Config) {
547+ // GStreamer fields (force_vsync, gl_rendering_mode, gstreamer_debug_level)
548+ // have moved to [engine.webkit] — only non-migrated media fields remain here.
566549 m.viper.SetDefault("media.hardware_decoding", string(defaults.Media.HardwareDecodingMode))
567550 m.viper.SetDefault("media.prefer_av1", defaults.Media.PreferAV1)
568551 m.viper.SetDefault("media.show_diagnostics", defaults.Media.ShowDiagnosticsOnStartup)
569- m.viper.SetDefault("media.force_vsync", defaults.Media.ForceVSync)
570- m.viper.SetDefault("media.gl_rendering_mode", string(defaults.Media.GLRenderingMode))
571- m.viper.SetDefault("media.gstreamer_debug_level", defaults.Media.GStreamerDebugLevel)
572552 }
573553
574-func (m *Manager) setRuntimeDefaults(defaults *Config) {
575- m.viper.SetDefault("runtime.prefix", defaults.Runtime.Prefix)
576-}
554+// setRuntimeDefaults removed — runtime.prefix moved to [engine.webkit].
577555
578556 func (m *Manager) setSessionDefaults(defaults *Config) {
579557 m.viper.SetDefault("session.auto_restore", defaults.Session.AutoRestore)
@@ -591,26 +569,7 @@ func (m *Manager) setUpdateDefaults(defaults *Config) {
591569 m.viper.SetDefault("update.notify_on_new_settings", defaults.Update.NotifyOnNewSettings)
592570 }
593571
594-func (m *Manager) setPerformanceDefaults(defaults *Config) {
595- m.viper.SetDefault("performance.profile", string(defaults.Performance.Profile))
596- m.viper.SetDefault("performance.zoom_cache_size", defaults.Performance.ZoomCacheSize)
597- m.viper.SetDefault("performance.webview_pool_prewarm_count", defaults.Performance.WebViewPoolPrewarmCount)
598- // Skia threading (only used when profile = "custom")
599- m.viper.SetDefault("performance.skia_cpu_painting_threads", defaults.Performance.SkiaCPUPaintingThreads)
600- m.viper.SetDefault("performance.skia_gpu_painting_threads", defaults.Performance.SkiaGPUPaintingThreads)
601- m.viper.SetDefault("performance.skia_enable_cpu_rendering", defaults.Performance.SkiaEnableCPURendering)
602- // Web process memory pressure
603- m.viper.SetDefault("performance.web_process_memory_limit_mb", defaults.Performance.WebProcessMemoryLimitMB)
604- m.viper.SetDefault("performance.web_process_memory_poll_interval_sec", defaults.Performance.WebProcessMemoryPollIntervalSec)
605- m.viper.SetDefault("performance.web_process_memory_conservative_threshold", defaults.Performance.WebProcessMemoryConservativeThreshold)
606- m.viper.SetDefault("performance.web_process_memory_strict_threshold", defaults.Performance.WebProcessMemoryStrictThreshold)
607- // Network process memory pressure
608- m.viper.SetDefault("performance.network_process_memory_limit_mb", defaults.Performance.NetworkProcessMemoryLimitMB)
609- m.viper.SetDefault("performance.network_process_memory_poll_interval_sec", defaults.Performance.NetworkProcessMemoryPollIntervalSec)
610- netConservativeThreshold := defaults.Performance.NetworkProcessMemoryConservativeThreshold
611- m.viper.SetDefault("performance.network_process_memory_conservative_threshold", netConservativeThreshold)
612- m.viper.SetDefault("performance.network_process_memory_strict_threshold", defaults.Performance.NetworkProcessMemoryStrictThreshold)
613-}
572+// setPerformanceDefaults removed — all fields moved to [engine]/[engine.webkit].
614573
615574 func (m *Manager) setDownloadsDefaults(defaults *Config) {
616575 m.viper.SetDefault("downloads.path", defaults.Downloads.Path)
@@ -429,17 +429,14 @@ func (m *Manager) setDefaults() {
429 m.setDebugDefaults(defaults)429 m.setDebugDefaults(defaults)
430 m.setAppearanceDefaults(defaults)430 m.setAppearanceDefaults(defaults)
431 m.setEngineDefaults(defaults)431 m.setEngineDefaults(defaults)
432- m.setRenderingDefaults(defaults)432+ m.setZoomAndScaleDefaults(defaults)
433- m.setPrivacyDefaults(defaults)
434 m.setWorkspaceDefaults(defaults)433 m.setWorkspaceDefaults(defaults)
435 m.setContentFilteringDefaults(defaults)434 m.setContentFilteringDefaults(defaults)
436 m.setClipboardDefaults(defaults)435 m.setClipboardDefaults(defaults)
437 m.setOmniboxDefaults(defaults)436 m.setOmniboxDefaults(defaults)
438 m.setMediaDefaults(defaults)437 m.setMediaDefaults(defaults)
439- m.setRuntimeDefaults(defaults)
440 m.setSessionDefaults(defaults)438 m.setSessionDefaults(defaults)
441 m.setUpdateDefaults(defaults)439 m.setUpdateDefaults(defaults)
442- m.setPerformanceDefaults(defaults)
443 m.setDownloadsDefaults(defaults)440 m.setDownloadsDefaults(defaults)
444 }441 }
445 442
@@ -489,27 +486,11 @@ func (m *Manager) setAppearanceDefaults(defaults *Config) {
489 m.viper.SetDefault("appearance.color_scheme", defaults.Appearance.ColorScheme)486 m.viper.SetDefault("appearance.color_scheme", defaults.Appearance.ColorScheme)
490 }487 }
491 488
492-func (m *Manager) setRenderingDefaults(defaults *Config) {489+func (m *Manager) setZoomAndScaleDefaults(defaults *Config) {
493- m.viper.SetDefault("rendering.mode", string(defaults.Rendering.Mode))
494- m.viper.SetDefault("rendering.disable_dmabuf_renderer", defaults.Rendering.DisableDMABufRenderer)
495- m.viper.SetDefault("rendering.force_compositing_mode", defaults.Rendering.ForceCompositingMode)
496- m.viper.SetDefault("rendering.disable_compositing_mode", defaults.Rendering.DisableCompositingMode)
497- m.viper.SetDefault("rendering.gsk_renderer", string(defaults.Rendering.GSKRenderer))
498- m.viper.SetDefault("rendering.disable_mipmaps", defaults.Rendering.DisableMipmaps)
499- m.viper.SetDefault("rendering.prefer_gl", defaults.Rendering.PreferGL)
500- m.viper.SetDefault("rendering.draw_compositing_indicators", defaults.Rendering.DrawCompositingIndicators)
501- m.viper.SetDefault("rendering.show_fps", defaults.Rendering.ShowFPS)
502- m.viper.SetDefault("rendering.sample_memory", defaults.Rendering.SampleMemory)
503- m.viper.SetDefault("rendering.debug_frames", defaults.Rendering.DebugFrames)
504 m.viper.SetDefault("default_webpage_zoom", defaults.DefaultWebpageZoom)490 m.viper.SetDefault("default_webpage_zoom", defaults.DefaultWebpageZoom)
505 m.viper.SetDefault("default_ui_scale", defaults.DefaultUIScale)491 m.viper.SetDefault("default_ui_scale", defaults.DefaultUIScale)
506 }492 }
507 493
508-func (m *Manager) setPrivacyDefaults(defaults *Config) {
509- m.viper.SetDefault("privacy.cookie_policy", string(defaults.Privacy.CookiePolicy))
510- m.viper.SetDefault("privacy.itp_enabled", defaults.Privacy.ITPEnabled)
511-}
512-
513 func (m *Manager) setWorkspaceDefaults(defaults *Config) {494 func (m *Manager) setWorkspaceDefaults(defaults *Config) {
514 m.viper.SetDefault("workspace.new_pane_url", defaults.Workspace.NewPaneURL)495 m.viper.SetDefault("workspace.new_pane_url", defaults.Workspace.NewPaneURL)
515 m.viper.SetDefault("workspace.pane_mode.activation_shortcut", defaults.Workspace.PaneMode.ActivationShortcut)496 m.viper.SetDefault("workspace.pane_mode.activation_shortcut", defaults.Workspace.PaneMode.ActivationShortcut)
@@ -563,17 +544,14 @@ func (m *Manager) setOmniboxDefaults(defaults *Config) {
563 }544 }
564 545
565 func (m *Manager) setMediaDefaults(defaults *Config) {546 func (m *Manager) setMediaDefaults(defaults *Config) {
547+ // GStreamer fields (force_vsync, gl_rendering_mode, gstreamer_debug_level)
548+ // have moved to [engine.webkit] — only non-migrated media fields remain here.
566 m.viper.SetDefault("media.hardware_decoding", string(defaults.Media.HardwareDecodingMode))549 m.viper.SetDefault("media.hardware_decoding", string(defaults.Media.HardwareDecodingMode))
567 m.viper.SetDefault("media.prefer_av1", defaults.Media.PreferAV1)550 m.viper.SetDefault("media.prefer_av1", defaults.Media.PreferAV1)
568 m.viper.SetDefault("media.show_diagnostics", defaults.Media.ShowDiagnosticsOnStartup)551 m.viper.SetDefault("media.show_diagnostics", defaults.Media.ShowDiagnosticsOnStartup)
569- m.viper.SetDefault("media.force_vsync", defaults.Media.ForceVSync)
570- m.viper.SetDefault("media.gl_rendering_mode", string(defaults.Media.GLRenderingMode))
571- m.viper.SetDefault("media.gstreamer_debug_level", defaults.Media.GStreamerDebugLevel)
572 }552 }
573 553
574-func (m *Manager) setRuntimeDefaults(defaults *Config) {554+// setRuntimeDefaults removed — runtime.prefix moved to [engine.webkit].
575- m.viper.SetDefault("runtime.prefix", defaults.Runtime.Prefix)
576-}
577 555
578 func (m *Manager) setSessionDefaults(defaults *Config) {556 func (m *Manager) setSessionDefaults(defaults *Config) {
579 m.viper.SetDefault("session.auto_restore", defaults.Session.AutoRestore)557 m.viper.SetDefault("session.auto_restore", defaults.Session.AutoRestore)
@@ -591,26 +569,7 @@ func (m *Manager) setUpdateDefaults(defaults *Config) {
591 m.viper.SetDefault("update.notify_on_new_settings", defaults.Update.NotifyOnNewSettings)569 m.viper.SetDefault("update.notify_on_new_settings", defaults.Update.NotifyOnNewSettings)
592 }570 }
593 571
594-func (m *Manager) setPerformanceDefaults(defaults *Config) {572+// setPerformanceDefaults removed — all fields moved to [engine]/[engine.webkit].
595- m.viper.SetDefault("performance.profile", string(defaults.Performance.Profile))
596- m.viper.SetDefault("performance.zoom_cache_size", defaults.Performance.ZoomCacheSize)
597- m.viper.SetDefault("performance.webview_pool_prewarm_count", defaults.Performance.WebViewPoolPrewarmCount)
598- // Skia threading (only used when profile = "custom")
599- m.viper.SetDefault("performance.skia_cpu_painting_threads", defaults.Performance.SkiaCPUPaintingThreads)
600- m.viper.SetDefault("performance.skia_gpu_painting_threads", defaults.Performance.SkiaGPUPaintingThreads)
601- m.viper.SetDefault("performance.skia_enable_cpu_rendering", defaults.Performance.SkiaEnableCPURendering)
602- // Web process memory pressure
603- m.viper.SetDefault("performance.web_process_memory_limit_mb", defaults.Performance.WebProcessMemoryLimitMB)
604- m.viper.SetDefault("performance.web_process_memory_poll_interval_sec", defaults.Performance.WebProcessMemoryPollIntervalSec)
605- m.viper.SetDefault("performance.web_process_memory_conservative_threshold", defaults.Performance.WebProcessMemoryConservativeThreshold)
606- m.viper.SetDefault("performance.web_process_memory_strict_threshold", defaults.Performance.WebProcessMemoryStrictThreshold)
607- // Network process memory pressure
608- m.viper.SetDefault("performance.network_process_memory_limit_mb", defaults.Performance.NetworkProcessMemoryLimitMB)
609- m.viper.SetDefault("performance.network_process_memory_poll_interval_sec", defaults.Performance.NetworkProcessMemoryPollIntervalSec)
610- netConservativeThreshold := defaults.Performance.NetworkProcessMemoryConservativeThreshold
611- m.viper.SetDefault("performance.network_process_memory_conservative_threshold", netConservativeThreshold)
612- m.viper.SetDefault("performance.network_process_memory_strict_threshold", defaults.Performance.NetworkProcessMemoryStrictThreshold)
613-}
614 573
615 func (m *Manager) setDownloadsDefaults(defaults *Config) {574 func (m *Manager) setDownloadsDefaults(defaults *Config) {
616 m.viper.SetDefault("downloads.path", defaults.Downloads.Path)575 m.viper.SetDefault("downloads.path", defaults.Downloads.Path)
M internal/infrastructure/config/loader_test.go +19 -3
@@ -7,12 +7,28 @@ import (
77 "github.com/stretchr/testify/assert"
88 )
99
10-func TestSetPrivacyDefaults(t *testing.T) {
10+func TestSetEngineDefaults(t *testing.T) {
1111 mgr := &Manager{viper: viper.New()}
1212 mgr.setDefaults()
1313
14- assert.Equal(t, "no_third_party", mgr.viper.GetString("privacy.cookie_policy"))
15- assert.True(t, mgr.viper.GetBool("privacy.itp_enabled"))
14+ // Universal engine fields
15+ assert.Equal(t, "webkit", mgr.viper.GetString("engine.type"))
16+ assert.Equal(t, "default", mgr.viper.GetString("engine.profile"))
17+ assert.Equal(t, "no_third_party", mgr.viper.GetString("engine.cookie_policy"))
18+ assert.Equal(t, 4, mgr.viper.GetInt("engine.pool_prewarm_count"))
19+ assert.Equal(t, 256, mgr.viper.GetInt("engine.zoom_cache_size"))
20+
21+ // WebKit-specific engine fields
22+ assert.True(t, mgr.viper.GetBool("engine.webkit.itp_enabled"))
23+ assert.Equal(t, "auto", mgr.viper.GetString("engine.webkit.gsk_renderer"))
24+ assert.Equal(t, "auto", mgr.viper.GetString("engine.webkit.gl_rendering_mode"))
25+ assert.False(t, mgr.viper.GetBool("engine.webkit.disable_dmabuf_renderer"))
26+
27+ // Old sections should NOT be registered as defaults
28+ assert.Empty(t, mgr.viper.GetString("privacy.cookie_policy"))
29+ assert.Empty(t, mgr.viper.GetString("rendering.mode"))
30+ assert.Empty(t, mgr.viper.GetString("performance.profile"))
31+ assert.Empty(t, mgr.viper.GetString("runtime.prefix"))
1632 }
1733
1834 func TestNormalizeConfig_PrivacyCookiePolicy(t *testing.T) {
@@ -7,12 +7,28 @@ import (
7 "github.com/stretchr/testify/assert"7 "github.com/stretchr/testify/assert"
8 )8 )
9 9
10-func TestSetPrivacyDefaults(t *testing.T) {10+func TestSetEngineDefaults(t *testing.T) {
11 mgr := &Manager{viper: viper.New()}11 mgr := &Manager{viper: viper.New()}
12 mgr.setDefaults()12 mgr.setDefaults()
13 13
14- assert.Equal(t, "no_third_party", mgr.viper.GetString("privacy.cookie_policy"))14+ // Universal engine fields
15- assert.True(t, mgr.viper.GetBool("privacy.itp_enabled"))15+ assert.Equal(t, "webkit", mgr.viper.GetString("engine.type"))
16+ assert.Equal(t, "default", mgr.viper.GetString("engine.profile"))
17+ assert.Equal(t, "no_third_party", mgr.viper.GetString("engine.cookie_policy"))
18+ assert.Equal(t, 4, mgr.viper.GetInt("engine.pool_prewarm_count"))
19+ assert.Equal(t, 256, mgr.viper.GetInt("engine.zoom_cache_size"))
20+
21+ // WebKit-specific engine fields
22+ assert.True(t, mgr.viper.GetBool("engine.webkit.itp_enabled"))
23+ assert.Equal(t, "auto", mgr.viper.GetString("engine.webkit.gsk_renderer"))
24+ assert.Equal(t, "auto", mgr.viper.GetString("engine.webkit.gl_rendering_mode"))
25+ assert.False(t, mgr.viper.GetBool("engine.webkit.disable_dmabuf_renderer"))
26+
27+ // Old sections should NOT be registered as defaults
28+ assert.Empty(t, mgr.viper.GetString("privacy.cookie_policy"))
29+ assert.Empty(t, mgr.viper.GetString("rendering.mode"))
30+ assert.Empty(t, mgr.viper.GetString("performance.profile"))
31+ assert.Empty(t, mgr.viper.GetString("runtime.prefix"))
16 }32 }
17 33
18 func TestNormalizeConfig_PrivacyCookiePolicy(t *testing.T) {34 func TestNormalizeConfig_PrivacyCookiePolicy(t *testing.T) {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close