Procházet zdrojové kódy

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

Simon Frei před 5 roky
rodič
revize
88599bc154
1 změnil soubory, kde provedl 15 přidání a 13 odebrání
  1. 15 13
      lib/model/folder_sendrecv.go

+ 15 - 13
lib/model/folder_sendrecv.go

@@ -61,18 +61,17 @@ type copyBlocksState struct {
 const retainBits = fs.ModeSetgid | fs.ModeSetuid | fs.ModeSticky
 
 var (
-	activity                    = newDeviceActivity()
-	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 "
-	errDirHasToBeScanned        = errors.New(errDirPrefix + "contains changed files, scheduling scan")
-	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")
-	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")
-	errUnexpectedDirOnFileDel   = errors.New("encountered directory when trying to remove file/symlink")
-	errIncompatibleSymlink      = errors.New("incompatible symlink entry; rescan with newer Syncthing on source")
-	contextRemovingOldItem      = "removing item to be replaced"
+	activity                  = newDeviceActivity()
+	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 "
+	errDirHasToBeScanned      = errors.New(errDirPrefix + "contains changed files, scheduling scan")
+	errDirHasIgnored          = errors.New(errDirPrefix + "contains ignored files (see ignore documentation for (?d) prefix)")
+	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")
+	errModified               = errors.New("file modified but not rescanned; will try again later")
+	errUnexpectedDirOnFileDel = errors.New("encountered directory when trying to remove file/symlink")
+	errIncompatibleSymlink    = errors.New("incompatible symlink entry; rescan with newer Syncthing on source")
+	contextRemovingOldItem    = "removing item to be replaced"
 )
 
 type dbUpdateType int
@@ -1894,7 +1893,10 @@ func (f *sendReceiveFolder) deleteDirOnDisk(dir string, snap *db.Snapshot, scanC
 		return errDirHasIgnored
 	}
 	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 {
 		return errDirNotEmpty