From 7cddaf82abcc6f579f012835ba5d2e8006cb3bd3 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 16 Oct 2018 13:42:52 +0200 Subject: [PATCH] ProcessDirectoryJob: always set _childModified to true, regardless the direction 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 | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 602f96082..c8dc6aaa1 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -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 -- 2.30.2