fix(config): properly apply defaults when reading folder configuration (#10034)

This commit is contained in:
Tommy van der Vorst
2025-04-04 16:46:12 +00:00
committed by GitHub
parent 3e7ccf7c48
commit f7c8efd93c
2 changed files with 32 additions and 5 deletions
+8 -4
View File
@@ -101,7 +101,7 @@ func TestDefaultValues(t *testing.T) {
Defaults: Defaults{ Defaults: Defaults{
Folder: FolderConfiguration{ Folder: FolderConfiguration{
FilesystemType: FilesystemTypeBasic, FilesystemType: FilesystemTypeBasic,
Path: "~", Path: "",
Type: FolderTypeSendReceive, Type: FolderTypeSendReceive,
Devices: []FolderDeviceConfiguration{{DeviceID: device1}}, Devices: []FolderDeviceConfiguration{{DeviceID: device1}},
RescanIntervalS: 3600, RescanIntervalS: 3600,
@@ -181,7 +181,7 @@ func TestDeviceConfig(t *testing.T) {
Devices: []FolderDeviceConfiguration{{DeviceID: device1}, {DeviceID: device4}}, Devices: []FolderDeviceConfiguration{{DeviceID: device1}, {DeviceID: device4}},
Type: FolderTypeSendOnly, Type: FolderTypeSendOnly,
RescanIntervalS: 600, RescanIntervalS: 600,
FSWatcherEnabled: false, FSWatcherEnabled: true,
FSWatcherDelayS: 10, FSWatcherDelayS: 10,
Copiers: 0, Copiers: 0,
Hashers: 0, Hashers: 0,
@@ -189,14 +189,18 @@ func TestDeviceConfig(t *testing.T) {
MinDiskFree: Size{1, "%"}, MinDiskFree: Size{1, "%"},
MaxConflicts: -1, MaxConflicts: -1,
Versioning: VersioningConfiguration{ Versioning: VersioningConfiguration{
Params: map[string]string{}, CleanupIntervalS: 3600,
FSType: FilesystemTypeBasic,
Params: map[string]string{},
}, },
WeakHashThresholdPct: 25, WeakHashThresholdPct: 25,
MarkerName: DefaultMarkerName, MarkerName: DefaultMarkerName,
JunctionsAsDirs: true, JunctionsAsDirs: true,
MaxConcurrentWrites: maxConcurrentWritesDefault, MaxConcurrentWrites: maxConcurrentWritesDefault,
XattrFilter: XattrFilter{ XattrFilter: XattrFilter{
Entries: []XattrFilterEntry{}, MaxSingleEntrySize: 1024,
MaxTotalSize: 4096,
Entries: []XattrFilterEntry{},
}, },
}, },
} }
+24 -1
View File
@@ -9,6 +9,8 @@ package config
import ( import (
"bytes" "bytes"
"crypto/sha256" "crypto/sha256"
"encoding/json"
"encoding/xml"
"errors" "errors"
"fmt" "fmt"
"path" "path"
@@ -23,6 +25,7 @@ import (
"github.com/syncthing/syncthing/lib/db" "github.com/syncthing/syncthing/lib/db"
"github.com/syncthing/syncthing/lib/fs" "github.com/syncthing/syncthing/lib/fs"
"github.com/syncthing/syncthing/lib/protocol" "github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/structutil"
) )
var ( var (
@@ -48,7 +51,7 @@ type FolderConfiguration struct {
ID string `json:"id" xml:"id,attr" nodefault:"true"` ID string `json:"id" xml:"id,attr" nodefault:"true"`
Label string `json:"label" xml:"label,attr" restart:"false"` Label string `json:"label" xml:"label,attr" restart:"false"`
FilesystemType FilesystemType `json:"filesystemType" xml:"filesystemType" default:"basic"` FilesystemType FilesystemType `json:"filesystemType" xml:"filesystemType" default:"basic"`
Path string `json:"path" xml:"path,attr" default:"~"` Path string `json:"path" xml:"path,attr"`
Type FolderType `json:"type" xml:"type,attr"` Type FolderType `json:"type" xml:"type,attr"`
Devices []FolderDeviceConfiguration `json:"devices" xml:"device"` Devices []FolderDeviceConfiguration `json:"devices" xml:"device"`
RescanIntervalS int `json:"rescanIntervalS" xml:"rescanIntervalS,attr" default:"3600"` RescanIntervalS int `json:"rescanIntervalS" xml:"rescanIntervalS,attr" default:"3600"`
@@ -399,3 +402,23 @@ func (f XattrFilter) GetMaxSingleEntrySize() int {
func (f XattrFilter) GetMaxTotalSize() int { func (f XattrFilter) GetMaxTotalSize() int {
return f.MaxTotalSize return f.MaxTotalSize
} }
func (f *FolderConfiguration) UnmarshalJSON(data []byte) error {
structutil.SetDefaults(f)
// avoid recursing into this method
type noCustomUnmarshal FolderConfiguration
ptr := (*noCustomUnmarshal)(f)
return json.Unmarshal(data, ptr)
}
func (f *FolderConfiguration) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
structutil.SetDefaults(f)
// avoid recursing into this method
type noCustomUnmarshal FolderConfiguration
ptr := (*noCustomUnmarshal)(f)
return d.DecodeElement(ptr, &start)
}