Browse Source

lib/model: Add name of latest modifying device to conflict file (fixes #3524)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4161
LGTM: AudriusButkevicius, calmh
nrm21 8 năm trước cách đây
mục cha
commit
1235cead35
1 tập tin đã thay đổi với 10 bổ sung5 xóa
  1. 10 5
      lib/model/rwfolder.go

+ 10 - 5
lib/model/rwfolder.go

@@ -852,7 +852,9 @@ func (f *sendReceiveFolder) deleteFile(file protocol.FileInfo) {
 		// of deleting. Also merge with the version vector we had, to indicate
 		// we have resolved the conflict.
 		file.Version = file.Version.Merge(cur.Version)
-		err = osutil.InWritableDir(f.moveForConflict, realName)
+		err = osutil.InWritableDir(func(name string) error {
+			return f.moveForConflict(name, file.ModifiedBy.String())
+		}, realName)
 	} else if f.versioner != nil {
 		err = osutil.InWritableDir(f.versioner.Archive, realName)
 	} else {
@@ -1454,7 +1456,10 @@ func (f *sendReceiveFolder) performFinish(state *sharedPullerState) error {
 			// we have resolved the conflict.
 
 			state.file.Version = state.file.Version.Merge(state.version)
-			if err = osutil.InWritableDir(f.moveForConflict, state.realName); err != nil {
+			err = osutil.InWritableDir(func(name string) error {
+				return f.moveForConflict(name, state.file.ModifiedBy.String())
+			}, state.realName)
+			if err != nil {
 				return err
 			}
 
@@ -1661,7 +1666,7 @@ func removeAvailability(availabilities []Availability, availability Availability
 	return availabilities
 }
 
-func (f *sendReceiveFolder) moveForConflict(name string) error {
+func (f *sendReceiveFolder) moveForConflict(name string, lastModBy string) error {
 	if strings.Contains(filepath.Base(name), ".sync-conflict-") {
 		l.Infoln("Conflict for", name, "which is already a conflict copy; not copying again.")
 		if err := os.Remove(name); err != nil && !os.IsNotExist(err) {
@@ -1679,7 +1684,7 @@ func (f *sendReceiveFolder) moveForConflict(name string) error {
 
 	ext := filepath.Ext(name)
 	withoutExt := name[:len(name)-len(ext)]
-	newName := withoutExt + time.Now().Format(".sync-conflict-20060102-150405") + ext
+	newName := withoutExt + time.Now().Format(".sync-conflict-20060102-150405-") + lastModBy + ext
 	err := os.Rename(name, newName)
 	if os.IsNotExist(err) {
 		// We were supposed to move a file away but it does not exist. Either
@@ -1689,7 +1694,7 @@ func (f *sendReceiveFolder) moveForConflict(name string) error {
 		err = nil
 	}
 	if f.MaxConflicts > -1 {
-		matches, gerr := osutil.Glob(withoutExt + ".sync-conflict-????????-??????" + ext)
+		matches, gerr := osutil.Glob(withoutExt + ".sync-conflict-????????-??????*" + ext)
 		if gerr == nil && len(matches) > f.MaxConflicts {
 			sort.Sort(sort.Reverse(sort.StringSlice(matches)))
 			for _, match := range matches[f.MaxConflicts:] {