lib/model: Handle del. dir with locally changed items on pull (fixes #6873) (#6914)

This commit is contained in:
Simon Frei
2020-08-20 10:56:29 +02:00
committed by GitHub
parent fc2c46e82f
commit 88599bc154
+15 -13
View File
@@ -61,18 +61,17 @@ type copyBlocksState struct {
const retainBits = fs.ModeSetgid | fs.ModeSetuid | fs.ModeSticky const retainBits = fs.ModeSetgid | fs.ModeSetuid | fs.ModeSticky
var ( var (
activity = newDeviceActivity() activity = newDeviceActivity()
errNoDevice = errors.New("peers who had this file went away, or the file has changed while syncing. will retry later") errNoDevice = errors.New("peers who had this file went away, or the file has changed while syncing. will retry later")
errDirPrefix = "directory has been deleted on a remote device but " errDirPrefix = "directory has been deleted on a remote device but "
errDirHasToBeScanned = errors.New(errDirPrefix + "contains changed files, scheduling scan") errDirHasToBeScanned = errors.New(errDirPrefix + "contains changed files, scheduling scan")
errDirHasIgnored = errors.New(errDirPrefix + "contains ignored files (see ignore documentation for (?d) prefix)") errDirHasIgnored = errors.New(errDirPrefix + "contains ignored files (see ignore documentation for (?d) prefix)")
errDirHasReceiveOnlyChanged = errors.New(errDirPrefix + "contains locally changed files") errDirNotEmpty = errors.New(errDirPrefix + "is not empty; the contents are probably ignored on that remote device, but not locally")
errDirNotEmpty = errors.New(errDirPrefix + "is not empty; the contents are probably ignored on that remote device, but not locally") errNotAvailable = errors.New("no connected device has the required version of this file")
errNotAvailable = errors.New("no connected device has the required version of this file") errModified = errors.New("file modified but not rescanned; will try again later")
errModified = errors.New("file modified but not rescanned; will try again later") errUnexpectedDirOnFileDel = errors.New("encountered directory when trying to remove file/symlink")
errUnexpectedDirOnFileDel = errors.New("encountered directory when trying to remove file/symlink") errIncompatibleSymlink = errors.New("incompatible symlink entry; rescan with newer Syncthing on source")
errIncompatibleSymlink = errors.New("incompatible symlink entry; rescan with newer Syncthing on source") contextRemovingOldItem = "removing item to be replaced"
contextRemovingOldItem = "removing item to be replaced"
) )
type dbUpdateType int type dbUpdateType int
@@ -1894,7 +1893,10 @@ func (f *sendReceiveFolder) deleteDirOnDisk(dir string, snap *db.Snapshot, scanC
return errDirHasIgnored return errDirHasIgnored
} }
if hasReceiveOnlyChanged { if hasReceiveOnlyChanged {
return errDirHasReceiveOnlyChanged // Pretend we deleted the directory. It will be resurrected as a
// receive-only changed item on scan.
scanChan <- dir
return nil
} }
if hasKnown { if hasKnown {
return errDirNotEmpty return errDirNotEmpty