lib/model: Fix case-only renames on pull (#6978)

This commit is contained in:
Simon Frei
2020-09-10 08:23:54 +02:00
committed by GitHub
parent 780fb3bac1
commit 56d48d341f
2 changed files with 58 additions and 9 deletions
+19 -9
View File
@@ -945,16 +945,26 @@ func (f *sendReceiveFolder) renameFile(cur, source, target protocol.FileInfo, sn
// Check that the target corresponds to what we have in the DB
curTarget, ok := snap.Get(protocol.LocalDeviceID, target.Name)
switch stat, serr := f.fs.Lstat(target.Name); {
case serr != nil && fs.IsNotExist(serr):
if !ok || curTarget.IsDeleted() {
break
}
scanChan <- target.Name
err = errModified
case serr != nil:
// We can't check whether the file changed as compared to the db,
// do not delete.
err = serr
var caseErr *fs.ErrCaseConflict
switch {
case errors.As(serr, &caseErr):
if caseErr.Real != source.Name {
err = serr
break
}
fallthrough // This is a case only rename
case fs.IsNotExist(serr):
if !ok || curTarget.IsDeleted() {
break
}
scanChan <- target.Name
err = errModified
default:
// We can't check whether the file changed as compared to the db,
// do not delete.
err = serr
}
case !ok:
// Target appeared from nowhere
scanChan <- target.Name