Vfs: Preserve pin state on hydration
authorChristian Kamm <mail@ckamm.de>
Thu, 18 Jul 2019 13:30:40 +0000 (15:30 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:53 +0000 (10:58 +0100)
For #7322 and #7323

src/libsync/propagatedownload.cpp
test/testsyncvirtualfiles.cpp

index 5bd245c490b1a41be32b6aeaa64f2f966808488f..d4a68aa045cb6f4421fb6288b9dbd5207d1315c6 100644 (file)
@@ -1029,10 +1029,10 @@ void PropagateDownloadFile::downloadFinished()
             propagator()->_journal->deleteFileRecord(virtualFile);
 
             // Move the pin state to the new location
-            auto pin = propagator()->_journal->internalPinStates().rawForPath(_item->_file.toUtf8());
+            auto pin = propagator()->_journal->internalPinStates().rawForPath(virtualFile.toUtf8());
             if (pin && *pin != PinState::Inherited) {
-                vfs->setPinState(virtualFile, *pin);
-                vfs->setPinState(_item->_file, PinState::Inherited);
+                vfs->setPinState(_item->_file, *pin);
+                vfs->setPinState(virtualFile, PinState::Inherited);
             }
         }
     }
index 50fa7409d78a0184dac6333d7615f322c992bf56..5bf886f49ea784d2b9ccd46ea1ae3a8e1016bf94 100644 (file)
@@ -1162,6 +1162,18 @@ private slots:
         QVERIFY(fakeFolder.syncOnce());
         QCOMPARE(*vfs->pinState("onlinerenamed2/file1rename"), PinState::OnlineOnly);
         QCOMPARE(*vfs->pinState("onlinerenamed2/file1rename" DVSUFFIX), PinState::OnlineOnly);
+
+        // When a file is hydrated or dehydrated due to pin state it retains its pin state
+        vfs->setPinState("onlinerenamed2/file1rename" DVSUFFIX, PinState::AlwaysLocal);
+        QVERIFY(fakeFolder.syncOnce());
+        QVERIFY(fakeFolder.currentLocalState().find("onlinerenamed2/file1rename"));
+        QCOMPARE(*vfs->pinState("onlinerenamed2/file1rename"), PinState::AlwaysLocal);
+
+        vfs->setPinState("onlinerenamed2", PinState::Unspecified);
+        vfs->setPinState("onlinerenamed2/file1rename", PinState::OnlineOnly);
+        QVERIFY(fakeFolder.syncOnce());
+        QVERIFY(fakeFolder.currentLocalState().find("onlinerenamed2/file1rename" DVSUFFIX));
+        QCOMPARE(*vfs->pinState("onlinerenamed2/file1rename" DVSUFFIX), PinState::OnlineOnly);
     }
 };