diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 75427126e..767ca8593 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -534,7 +534,7 @@ func syncthingMain(runtimeOptions RuntimeOptions) { // Event subscription for the API; must start early to catch the early events. The LocalDiskUpdated // event might overwhelm the event reciever in some situations so we will not subscribe to it here. - apiSub := events.NewBufferedSubscription(events.Default.Subscribe(events.AllEvents&^events.LocalDiskUpdated), 1000) + apiSub := events.NewBufferedSubscription(events.Default.Subscribe(events.AllEvents&^events.LocalChangeDetected), 1000) if len(os.Getenv("GOMAXPROCS")) == 0 { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/cmd/syncthing/verboseservice.go b/cmd/syncthing/verboseservice.go index 8dca14d71..18dcd108a 100644 --- a/cmd/syncthing/verboseservice.go +++ b/cmd/syncthing/verboseservice.go @@ -92,9 +92,10 @@ func (s *verboseService) formatEvent(ev events.Event) string { data := ev.Data.(map[string]interface{}) return fmt.Sprintf("Folder %q is now %v", data["folder"], data["to"]) - case events.LocalDiskUpdated: + case events.LocalChangeDetected: data := ev.Data.(map[string]string) - return fmt.Sprintf("%s a %s: [ %s ]", data["action"], data["type"], data["path"]) + // Local change detected in folder "foo": modified file /Users/jb/whatever + return fmt.Sprintf("Local change detected in folder %q: %s %s %s", data["folder"], data["action"], data["type"], data["path"]) case events.RemoteIndexUpdated: data := ev.Data.(map[string]interface{}) diff --git a/lib/events/events.go b/lib/events/events.go index 71f150ca7..62de7f738 100644 --- a/lib/events/events.go +++ b/lib/events/events.go @@ -27,7 +27,7 @@ const ( DeviceRejected DevicePaused DeviceResumed - LocalDiskUpdated + LocalChangeDetected LocalIndexUpdated RemoteIndexUpdated ItemStarted @@ -62,8 +62,8 @@ func (t EventType) String() string { return "DeviceDisconnected" case DeviceRejected: return "DeviceRejected" - case LocalDiskUpdated: - return "LocalDiskUpdated" + case LocalChangeDetected: + return "LocalChangeDetected" case LocalIndexUpdated: return "LocalIndexUpdated" case RemoteIndexUpdated: diff --git a/lib/model/model.go b/lib/model/model.go index 47698a2c3..075463b4d 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -1235,14 +1235,21 @@ func sendIndexTo(initial bool, minLocalVer int64, conn protocol.Connection, fold } func (m *Model) updateLocalsFromScanning(folder string, fs []protocol.FileInfo) { - m.updateLocals(folder, fs, false) + m.updateLocals(folder, fs) + + // Fire the LocalChangeDetected event to notify listeners about local + // updates. + m.fmut.RLock() + path := m.folderCfgs[folder].Path() + m.fmut.RUnlock() + m.localChangeDetected(folder, path, fs) } func (m *Model) updateLocalsFromPulling(folder string, fs []protocol.FileInfo) { - m.updateLocals(folder, fs, true) + m.updateLocals(folder, fs) } -func (m *Model) updateLocals(folder string, fs []protocol.FileInfo, fromPulling bool) { +func (m *Model) updateLocals(folder string, fs []protocol.FileInfo) { m.fmut.RLock() files := m.folderFiles[folder] m.fmut.RUnlock() @@ -1263,35 +1270,29 @@ func (m *Model) updateLocals(folder string, fs []protocol.FileInfo, fromPulling "filenames": filenames, "version": files.LocalVersion(protocol.LocalDeviceID), }) - - // Lets us know if file/folder change was originated locally or from a network - // sync update. Now write these to a global log file. - if !fromPulling { - m.localDiskUpdated(m.folderCfgs[folder].Path(), fs) - } } -func (m *Model) localDiskUpdated(path string, files []protocol.FileInfo) { +func (m *Model) localChangeDetected(folder, path string, files []protocol.FileInfo) { // For windows paths, strip unwanted chars from the front path = strings.Replace(path, `\\?\`, "", 1) for _, file := range files { objType := "file" - action := "Modified" + action := "modified" // If our local vector is verison 1 AND it is the only version vector so far seen for this file then // it is a new file. Else if it is > 1 it's not new, and if it is 1 but another shortId version vector // exists then it is new for us but created elsewhere so the file is still not new but modified by us. // Only if it is truly new do we change this to 'added', else we leave it as 'modified'. if len(file.Version) == 1 && file.Version[0].Value == 1 { - action = "Added" + action = "added" } if file.IsDirectory() { objType = "dir" } if file.IsDeleted() { - action = "Deleted" + action = "deleted" } // If the file is a level or more deep then the forward slash seperator is embedded @@ -1300,7 +1301,8 @@ func (m *Model) localDiskUpdated(path string, files []protocol.FileInfo) { // And append it to the filepath path := filepath.Join(path, filename) - events.Default.Log(events.LocalDiskUpdated, map[string]string{ + events.Default.Log(events.LocalChangeDetected, map[string]string{ + "folder": folder, "action": action, "type": objType, "path": path,