diff --git a/cmd/syncthing/gui.go b/cmd/syncthing/gui.go index 679ac1cfe..8aaa8ba4f 100644 --- a/cmd/syncthing/gui.go +++ b/cmd/syncthing/gui.go @@ -346,6 +346,7 @@ func restPostConfig(m *model.Model, w http.ResponseWriter, r *http.Request) { // Activate and save + configInSync = config.ChangeRequiresRestart(cfg.Raw(), newCfg) cfg.Replace(newCfg) cfg.Save() } diff --git a/internal/config/config.go b/internal/config/config.go index 9d13cbdb4..6e64335ae 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -198,40 +198,6 @@ func (cfg *Configuration) WriteXML(w io.Writer) error { return err } -func (cfg *Configuration) DeviceMap() map[protocol.DeviceID]DeviceConfiguration { - m := make(map[protocol.DeviceID]DeviceConfiguration, len(cfg.Devices)) - for _, n := range cfg.Devices { - m[n.DeviceID] = n - } - return m -} - -func (cfg *Configuration) GetDeviceConfiguration(deviceID protocol.DeviceID) *DeviceConfiguration { - for i, device := range cfg.Devices { - if device.DeviceID == deviceID { - return &cfg.Devices[i] - } - } - return nil -} - -func (cfg *Configuration) GetFolderConfiguration(folderID string) *FolderConfiguration { - for i, folder := range cfg.Folders { - if folder.ID == folderID { - return &cfg.Folders[i] - } - } - return nil -} - -func (cfg *Configuration) FolderMap() map[string]FolderConfiguration { - m := make(map[string]FolderConfiguration, len(cfg.Folders)) - for _, r := range cfg.Folders { - m[r.ID] = r - } - return m -} - func (cfg *Configuration) prepare(myID protocol.DeviceID) { fillNilSlices(&cfg.Options) @@ -317,14 +283,21 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) { } // Ensure this device is present in all relevant places - me := cfg.GetDeviceConfiguration(myID) - if me == nil { + myIDExists := false + for _, dev := range cfg.Devices { + if dev.DeviceID == myID { + myIDExists = true + break + } + } + if !myIDExists { myName, _ := os.Hostname() cfg.Devices = append(cfg.Devices, DeviceConfiguration{ DeviceID: myID, Name: myName, }) } + sort.Sort(DeviceConfigurationList(cfg.Devices)) // Ensure that any loose devices are not present in the wrong places // Ensure that there are no duplicate devices @@ -348,23 +321,17 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) { // complete restart. func ChangeRequiresRestart(from, to Configuration) bool { // Adding, removing or changing folders requires restart - if len(from.Folders) != len(to.Folders) { + if !reflect.DeepEqual(from.Folders, to.Folders) { return true } - fromFolders := from.FolderMap() - toFolders := to.FolderMap() - for id := range fromFolders { - if !reflect.DeepEqual(fromFolders[id], toFolders[id]) { - return true - } - } - // Removing a device requires a restart. Adding one does not. Changing - // address or name does not. - fromDevices := from.DeviceMap() - toDevices := to.DeviceMap() - for deviceID := range fromDevices { - if _, ok := toDevices[deviceID]; !ok { + // Removing a device requres restart + toDevs := make(map[protocol.DeviceID]bool, len(from.Devices)) + for _, dev := range to.Devices { + toDevs[dev.DeviceID] = true + } + for _, dev := range from.Devices { + if _, ok := toDevs[dev.DeviceID]; !ok { return true } } @@ -481,6 +448,7 @@ func convertV1V2(cfg *Configuration) { cfg.Version = 2 } + func setDefaults(data interface{}) error { s := reflect.ValueOf(data).Elem() t := s.Type()