case clash should not prevent full propagation
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 28 Nov 2022 15:43:29 +0000 (16:43 +0100)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Wed, 30 Nov 2022 10:49:35 +0000 (11:49 +0100)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/owncloudpropagator.cpp
test/testsyncengine.cpp

index cb3734e17a1300266773c3cd364d9e6f9c3fb52e..e221ac3275dedfa62b3a8328f1d62e8d0fefe8a0 100644 (file)
@@ -1333,6 +1333,7 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status)
     if (status != SyncFileItem::Success
         && status != SyncFileItem::Restoration
         && status != SyncFileItem::BlacklistedError
+        && status != SyncFileItem::FileNameClash
         && status != SyncFileItem::Conflict) {
         if (_state != Finished) {
             // Synchronously abort
@@ -1355,12 +1356,12 @@ void PropagateRootDirectory::slotSubJobsFinished(SyncFileItem::Status status)
         case SyncFileItem::FileLocked:
         case SyncFileItem::Restoration:
         case SyncFileItem::FileNameInvalid:
-        case SyncFileItem::FileNameClash:
         case SyncFileItem::DetailError:
         case SyncFileItem::Success:
             break;
+        case SyncFileItem::FileNameClash:
         case SyncFileItem::BlacklistedError:
-            _errorStatus = SyncFileItem::BlacklistedError;
+            _errorStatus = status;
             break;
         }
     }
index 8a9100a09ba8c4e703681a4754739560dd0cdfbc..a0b2ae38448ed4622ed2da716a02de71969293a4 100644 (file)
@@ -1282,6 +1282,27 @@ private slots:
         QVERIFY(fileThirdSync);
         QCOMPARE(fileThirdSync->lastModified.toSecsSinceEpoch(), CURRENT_MTIME);
     }
+
+    void testFolderRemovalWithCaseClash()
+    {
+        FakeFolder fakeFolder{ FileInfo{} };
+        fakeFolder.remoteModifier().mkdir("A");
+        fakeFolder.remoteModifier().insert("A/file");
+
+        QVERIFY(fakeFolder.syncOnce());
+        QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
+
+        fakeFolder.remoteModifier().insert("A/FILE");
+        QVERIFY(!fakeFolder.syncOnce());
+
+        fakeFolder.remoteModifier().mkdir("B");
+        fakeFolder.remoteModifier().rename("A/file", "B/file");
+        fakeFolder.remoteModifier().remove("A");
+
+        QVERIFY(!fakeFolder.syncOnce());
+        auto folderA = fakeFolder.currentLocalState().find("A");
+        QCOMPARE(folderA, nullptr);
+    }
 };
 
 QTEST_GUILESS_MAIN(TestSyncEngine)