fix(11-04): keep earlier overrides when compass Persist saves

Persist rewrote overrides.yaml with only this process's runtime values,
so saving one key (for example websockets:generate-vapid-keys --update)
dropped every key persisted earlier. It now starts from the saved file
and lets runtime values win.
This commit is contained in:
Jakub Zych
2026-09-30 13:45:13 +02:00
parent a9af0d77c7
commit 5fb22c28d0
3 changed files with 57 additions and 4 deletions

View File

@@ -27,7 +27,8 @@ func (c *Config) Set(path string, value any) error {
}
// Persist writes runtime overrides to config/env/<env>/overrides.yaml
// using an atomic replace and restrictive file permissions.
// using an atomic replace and restrictive file permissions. Keys already in
// the file are kept; a runtime value replaces the saved value of its key.
func (c *Config) Persist() error {
if c == nil {
return fmt.Errorf("compass: config is nil")
@@ -48,9 +49,20 @@ func (c *Config) Persist() error {
if err := os.MkdirAll(destDir, 0o700); err != nil {
return fmt.Errorf("compass: create overrides dir: %w", err)
}
raw := []byte("{}\n")
// Start from the values persisted earlier, so saving one runtime value
// never drops another key from the file; runtime values win.
merged := koanf.New(".")
if err := loadOverrides(merged, dest); err != nil {
return err
}
if c.runtime != nil {
body, err := c.runtime.Marshal(yaml.Parser())
if err := merged.Merge(c.runtime); err != nil {
return fmt.Errorf("compass: merge overrides: %w", err)
}
}
raw := []byte("{}\n")
if len(merged.Keys()) > 0 {
body, err := merged.Marshal(yaml.Parser())
if err != nil {
return fmt.Errorf("compass: marshal overrides: %w", err)
}