PropagateDownload: Create conflict even if local file changed
authorChristian Kamm <mail@ckamm.de>
Wed, 6 Feb 2019 14:12:57 +0000 (15:12 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:40 +0000 (10:58 +0100)
Fixes a bug introduced while moving the attribute propagation before the
conflict-renaming.

src/libsync/propagatedownload.cpp

index c0984d55ee731924de9be4f4dddf8228b7addd9e..39bec7eaea7938c9c4569e52ed729a944903fe80 100644 (file)
@@ -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;