ソースを参照

SocketAPI: fix status after a failure to move

Issue #7759
Olivier Goffart 5 年 前
コミット
317d3735d7
2 ファイル変更49 行追加5 行削除
  1. 5 5
      src/libsync/syncfilestatustracker.cpp
  2. 44 0
      test/testsyncfilestatustracker.cpp

+ 5 - 5
src/libsync/syncfilestatustracker.cpp

@@ -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;

+ 44 - 0
test/testsyncfilestatustracker.cpp

@@ -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)