From 43bcb3d5a59d8ace2f23718e3cffcb26e6767f01 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Mon, 4 Mar 2019 13:20:40 +0100 Subject: [PATCH] lib/model: Refactor conflict name handling (#5572) --- lib/model/folder_sendrecv.go | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/model/folder_sendrecv.go b/lib/model/folder_sendrecv.go index a051da98..a9e505e4 100644 --- a/lib/model/folder_sendrecv.go +++ b/lib/model/folder_sendrecv.go @@ -1736,8 +1736,8 @@ func removeAvailability(availabilities []Availability, availability Availability return availabilities } -func (f *sendReceiveFolder) moveForConflict(name string, lastModBy string, scanChan chan<- string) error { - if strings.Contains(filepath.Base(name), ".sync-conflict-") { +func (f *sendReceiveFolder) moveForConflict(name, lastModBy string, scanChan chan<- string) error { + if isConflict(name) { l.Infoln("Conflict for", name, "which is already a conflict copy; not copying again.") if err := f.fs.Remove(name); err != nil && !fs.IsNotExist(err) { return err @@ -1752,9 +1752,7 @@ func (f *sendReceiveFolder) moveForConflict(name string, lastModBy string, scanC return nil } - ext := filepath.Ext(name) - withoutExt := name[:len(name)-len(ext)] - newName := withoutExt + time.Now().Format(".sync-conflict-20060102-150405-") + lastModBy + ext + newName := conflictName(name, lastModBy) err := f.fs.Rename(name, newName) if fs.IsNotExist(err) { // We were supposed to move a file away but it does not exist. Either @@ -1764,17 +1762,14 @@ func (f *sendReceiveFolder) moveForConflict(name string, lastModBy string, scanC err = nil } if f.MaxConflicts > -1 { - matches, gerr := f.fs.Glob(withoutExt + ".sync-conflict-????????-??????*" + ext) - if gerr == nil && len(matches) > f.MaxConflicts { + matches := existingConflicts(name, f.fs) + if len(matches) > f.MaxConflicts { sort.Sort(sort.Reverse(sort.StringSlice(matches))) for _, match := range matches[f.MaxConflicts:] { - gerr = f.fs.Remove(match) - if gerr != nil { + if gerr := f.fs.Remove(match); gerr != nil { l.Debugln(f, "removing extra conflict", gerr) } } - } else if gerr != nil { - l.Debugln(f, "globbing for conflicts", gerr) } } if err == nil { @@ -1970,3 +1965,21 @@ func componentCount(name string) int { } return count } + +func conflictName(name, lastModBy string) string { + ext := filepath.Ext(name) + return name[:len(name)-len(ext)] + time.Now().Format(".sync-conflict-20060102-150405-") + lastModBy + ext +} + +func isConflict(name string) bool { + return strings.Contains(filepath.Base(name), ".sync-conflict-") +} + +func existingConflicts(name string, fs fs.Filesystem) []string { + ext := filepath.Ext(name) + matches, err := fs.Glob(name[:len(name)-len(ext)] + ".sync-conflict-????????-??????*" + ext) + if err != nil { + l.Debugln("globbing for conflicts", err) + } + return matches +}