ProcessDirectoryJob: always set _childModified to true, regardless the direction
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 16 Oct 2018 11:42:52 +0000 (13:42 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:09 +0000 (10:58 +0100)
This was like that to handle the case of CSYNC_INSTRUCTION_TYPE_CHANGE, but just add
a condition in this location.

src/libsync/discovery.cpp

index 602f960820e4b844bc1255f5094c210faabf42df..c8dc6aaa15fa1c4a7dda2915e464ff7b01c220a4 100644 (file)
@@ -649,9 +649,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
         serverModified = false;
         item->_type = ItemTypeVirtualFile;
     }
-    if (!_dirItem || _dirItem->_direction == SyncFileItem::Up) {
-        _childModified |= serverModified;
-    }
+    _childModified |= serverModified;
     if (localEntry.isValid()) {
         item->_inode = localEntry.inode;
         bool typeChange = dbEntry.isValid() && localEntry.isDirectory != (dbEntry._type == ItemTypeDirectory);
@@ -766,9 +764,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
             item->_size = localEntry.size;
             item->_modtime = localEntry.modtime;
             item->_type = localEntry.isDirectory ? ItemTypeDirectory : ItemTypeFile;
-            if (!_dirItem || _dirItem->_direction == SyncFileItem::Down) {
-                _childModified = true;
-            }
+            _childModified = true;
         } else if (!dbEntry.isValid()) { // New local file
             item->_instruction = CSYNC_INSTRUCTION_NEW;
             item->_direction = SyncFileItem::Up;
@@ -776,9 +772,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
             item->_size = localEntry.size;
             item->_modtime = localEntry.modtime;
             item->_type = localEntry.isDirectory ? ItemTypeDirectory : localEntry.isVirtualFile ? ItemTypeVirtualFile : ItemTypeFile;
-            if (!_dirItem || _dirItem->_direction == SyncFileItem::Down) {
-                _childModified = true;
-            }
+            _childModified = true;
 
             auto postProcessLocalNew = [item, localEntry, this]() {
                 if (localEntry.isVirtualFile) {
@@ -924,9 +918,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
             item->_modtime = localEntry.modtime;
             item->_previousSize = dbEntry._fileSize;
             item->_previousModtime = dbEntry._modtime;
-            if (!_dirItem || _dirItem->_direction == SyncFileItem::Down) {
-                _childModified = true;
-            }
+            _childModified = true;
 
             // Checksum comparison at this stage is only enabled for .eml files,
             // check #4754 #4755
@@ -1148,12 +1140,13 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs)
                 // re-create directory that has modified contents
                 _dirItem->_instruction = CSYNC_INSTRUCTION_NEW;
             }
-            if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE) {
+            if (_childModified && _dirItem->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE && !_dirItem->isDirectory()) {
+                // Replacing a directory by a file is a conflict, if the directory had modified children
+                _dirItem->_instruction = CSYNC_INSTRUCTION_CONFLICT;
                 if (_dirItem->_direction == SyncFileItem::Up) {
                     _dirItem->_type = ItemTypeDirectory;
                     _dirItem->_direction = SyncFileItem::Down;
                 }
-                _dirItem->_instruction = CSYNC_INSTRUCTION_CONFLICT;
             }
             if (_childIgnored && _dirItem->_instruction == CSYNC_INSTRUCTION_REMOVE) {
                 // Do not remove a directory that has ignored files