From 797734870fb0751177958c63c9c398e4aca9f720 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 6 Feb 2019 15:12:57 +0100 Subject: [PATCH] PropagateDownload: Create conflict even if local file changed Fixes a bug introduced while moving the attribute propagation before the conflict-renaming. --- src/libsync/propagatedownload.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index c0984d55e..39bec7eae 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -954,7 +954,8 @@ void PropagateDownloadFile::downloadFinished() // Accuracy, and we really need the time from the file system. (#3103) _item->_modtime = FileSystem::getModTime(_tmpFile.fileName()); - if (FileSystem::fileExists(fn)) { + bool previousFileExists = FileSystem::fileExists(fn); + if (previousFileExists) { // Preserve the existing file permissions. QFileInfo existingFile(fn); if (existingFile.permissions() != _tmpFile.permissions()) { @@ -964,18 +965,6 @@ void PropagateDownloadFile::downloadFinished() // Make the file a hydrated placeholder if possible propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn); - - // Check whether the existing file has changed since the discovery - // phase by comparing size and mtime to the previous values. This - // is necessary to avoid overwriting user changes that happened between - // the discovery phase and now. - const qint64 expectedSize = _item->_previousSize; - const time_t expectedMtime = _item->_previousModtime; - if (!FileSystem::verifyFileUnchanged(fn, expectedSize, expectedMtime)) { - propagator()->_anotherSyncNeeded = true; - done(SyncFileItem::SoftError, tr("File has changed since discovery")); - return; - } } // Apply the remote permissions @@ -989,6 +978,21 @@ void PropagateDownloadFile::downloadFinished() done(SyncFileItem::SoftError, error); return; } + previousFileExists = false; + } + + if (previousFileExists) { + // Check whether the existing file has changed since the discovery + // phase by comparing size and mtime to the previous values. This + // is necessary to avoid overwriting user changes that happened between + // the discovery phase and now. + const qint64 expectedSize = _item->_previousSize; + const time_t expectedMtime = _item->_previousModtime; + if (!FileSystem::verifyFileUnchanged(fn, expectedSize, expectedMtime)) { + propagator()->_anotherSyncNeeded = true; + done(SyncFileItem::SoftError, tr("File has changed since discovery")); + return; + } } QString error;