SocketAPI: fix status after a failure to move
authorOlivier Goffart <ogoffart@woboq.com>
Wed, 25 Mar 2020 10:37:03 +0000 (11:37 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:59:09 +0000 (10:59 +0100)
Issue #7759

src/libsync/syncfilestatustracker.cpp
test/testsyncfilestatustracker.cpp

index d10bcafa470021aed3827a77d485e29d984e2a48..276bc4f8d050e1aaa2ffff56f01b1b7e6808d5f3 100644 (file)
@@ -230,10 +230,10 @@ void SyncFileStatusTracker::slotAboutToPropagate(SyncFileItemVector &items)
         _dirtyPaths.remove(item->destination());
 
         if (hasErrorStatus(*item)) {
-            _syncProblems[item->_file] = SyncFileStatus::StatusError;
+            _syncProblems[item->destination()] = SyncFileStatus::StatusError;
             invalidateParentPaths(item->destination());
         } else if (hasExcludedStatus(*item)) {
-            _syncProblems[item->_file] = SyncFileStatus::StatusExcluded;
+            _syncProblems[item->destination()] = SyncFileStatus::StatusExcluded;
         }
 
         SharedFlag sharedFlag = item->_remotePerm.hasPermission(RemotePermissions::IsShared) ? Shared : NotShared;
@@ -274,12 +274,12 @@ void SyncFileStatusTracker::slotItemCompleted(const SyncFileItemPtr &item)
     qCDebug(lcStatusTracker) << "Item completed" << item->destination() << item->_status << item->_instruction;
 
     if (hasErrorStatus(*item)) {
-        _syncProblems[item->_file] = SyncFileStatus::StatusError;
+        _syncProblems[item->destination()] = SyncFileStatus::StatusError;
         invalidateParentPaths(item->destination());
     } else if (hasExcludedStatus(*item)) {
-        _syncProblems[item->_file] = SyncFileStatus::StatusExcluded;
+        _syncProblems[item->destination()] = SyncFileStatus::StatusExcluded;
     } else {
-        _syncProblems.erase(item->_file);
+        _syncProblems.erase(item->destination());
     }
 
     SharedFlag sharedFlag = item->_remotePerm.hasPermission(RemotePermissions::IsShared) ? Shared : NotShared;
index 28ca462790b9dc7824f5437423d4b4e4ece55436..34e66f401b86a71f6ba1f84dc19bc65259cd61b2 100644 (file)
@@ -465,6 +465,50 @@ private slots:
 
         QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
     }
+
+    void renameError() {
+        FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
+        fakeFolder.serverErrorPaths().append("A/a1");
+        fakeFolder.localModifier().rename("A/a1", "A/a1m");
+        fakeFolder.localModifier().rename("B/b1", "B/b1m");
+        StatusPushSpy statusSpy(fakeFolder.syncEngine());
+
+        fakeFolder.scheduleSync();
+        fakeFolder.execUntilBeforePropagation();
+
+        verifyThatPushMatchesPull(fakeFolder, statusSpy);
+
+        QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusSync));
+        QCOMPARE(statusSpy.statusOf("A/a1"), statusSpy.statusOf("A/a1notexist"));
+        QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusSync));
+        QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusSync));
+        QCOMPARE(statusSpy.statusOf("B"), SyncFileStatus(SyncFileStatus::StatusSync));
+        QCOMPARE(statusSpy.statusOf("B/b1m"), SyncFileStatus(SyncFileStatus::StatusSync));
+
+        fakeFolder.execUntilFinished();
+        verifyThatPushMatchesPull(fakeFolder, statusSpy);
+        QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusError));
+        QCOMPARE(statusSpy.statusOf("A/a1"), statusSpy.statusOf("A/a1notexist"));
+        QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusWarning));
+        QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusWarning));
+        QCOMPARE(statusSpy.statusOf("B"), SyncFileStatus(SyncFileStatus::StatusUpToDate));
+        QCOMPARE(statusSpy.statusOf("B/b1m"), SyncFileStatus(SyncFileStatus::StatusUpToDate));
+        statusSpy.clear();
+
+        QVERIFY(!fakeFolder.syncOnce());
+        verifyThatPushMatchesPull(fakeFolder, statusSpy);
+        statusSpy.clear();
+        QVERIFY(!fakeFolder.syncOnce());
+        verifyThatPushMatchesPull(fakeFolder, statusSpy);
+        QCOMPARE(statusSpy.statusOf("A/a1m"), SyncFileStatus(SyncFileStatus::StatusError));
+        QCOMPARE(statusSpy.statusOf("A/a1"), statusSpy.statusOf("A/a1notexist"));
+        QCOMPARE(statusSpy.statusOf("A"), SyncFileStatus(SyncFileStatus::StatusWarning));
+        QCOMPARE(statusSpy.statusOf(""), SyncFileStatus(SyncFileStatus::StatusWarning));
+        QCOMPARE(statusSpy.statusOf("B"), SyncFileStatus(SyncFileStatus::StatusNone));
+        QCOMPARE(statusSpy.statusOf("B/b1m"), SyncFileStatus(SyncFileStatus::StatusNone));
+        statusSpy.clear();
+    }
+
 };
 
 QTEST_GUILESS_MAIN(TestSyncFileStatusTracker)