SyncEngine: Fix renaming a single file cause the "delete all file" popup
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 4 Jun 2019 10:08:15 +0000 (12:08 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:51 +0000 (10:58 +0100)
Possibly a regression, since the new discovery discovers rist the renamed
files as removed

Issue #7204

src/libsync/syncengine.cpp
test/testallfilesdeleted.cpp

index eecf40fc8a6d295a8a3192a745acb1a409f9964a..d5bcd0cc60f4edd72879d13e20d6e06bf5ccefa0 100644 (file)
@@ -382,6 +382,8 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
         return;
     } else if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
         _hasRemoveFile = true;
+    } else if (item->_instruction == CSYNC_INSTRUCTION_RENAME) {
+        _hasNoneFiles = true; // If a file (or every file) has been renamed, it means not al files where deleted
     } else if (item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE
         || item->_instruction == CSYNC_INSTRUCTION_SYNC) {
         if (item->_direction == SyncFileItem::Up) {
index 894503f104742a705681a0ae25ba41a27473004d..1c4853d2cb7c9e3a0d1c754eb547ceae22872ea2 100644 (file)
@@ -274,6 +274,30 @@ private slots:
 
         QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
     }
+
+    void testSingleFileRenamed() {
+        FakeFolder fakeFolder{FileInfo{}};
+
+        int aboutToRemoveAllFilesCalled = 0;
+        QObject::connect(&fakeFolder.syncEngine(), &SyncEngine::aboutToRemoveAllFiles,
+            [&](SyncFileItem::Direction , bool *) {
+                aboutToRemoveAllFilesCalled++;
+                QFAIL("should not be called");
+            });
+
+        // add a single file
+        fakeFolder.localModifier().insert("hello.txt");
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(aboutToRemoveAllFilesCalled, 0);
+        QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+        // rename it
+        fakeFolder.localModifier().rename("hello.txt", "goodbye.txt");
+
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(aboutToRemoveAllFilesCalled, 0);
+        QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+    }
 };
 
 QTEST_GUILESS_MAIN(TestAllFilesDeleted)