Vfs suffix: Fix dehydration creating the wrong db entry
authorChristian Kamm <mail@ckamm.de>
Wed, 6 Feb 2019 14:07:54 +0000 (15:07 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:40 +0000 (10:58 +0100)
src/libsync/discovery.cpp
src/libsync/propagatedownload.cpp
src/libsync/syncfileitem.h
src/libsync/vfs/suffix/vfs_suffix.cpp
test/testsyncvirtualfiles.cpp

index 28f2140b1c70df9903d9809b2fe1e4fb2c68c761..51dc164ddbfb330a921abf4fd107fa880ac8fdb5 100644 (file)
@@ -961,12 +961,19 @@ void ProcessDirectoryJob::processFileFinalize(
     QueryMode recurseQueryLocal, QueryMode recurseQueryServer)
 {
     // Adjust target path for virtual-suffix files
-    if (item->_type == ItemTypeVirtualFile && isVfsWithSuffix()) {
-        addVirtualFileSuffix(path._target);
-        if (item->_instruction == CSYNC_INSTRUCTION_RENAME)
+    if (isVfsWithSuffix()) {
+        if (item->_type == ItemTypeVirtualFile) {
+            addVirtualFileSuffix(path._target);
+            if (item->_instruction == CSYNC_INSTRUCTION_RENAME)
+                addVirtualFileSuffix(item->_renameTarget);
+            else
+                addVirtualFileSuffix(item->_file);
+        }
+        if (item->_type == ItemTypeVirtualFileDehydration
+            && item->_instruction == CSYNC_INSTRUCTION_NEW) {
+            item->_renameTarget = item->_file;
             addVirtualFileSuffix(item->_renameTarget);
-        else
-            addVirtualFileSuffix(item->_file);
+        }
     }
 
     if (path._original != path._target && (item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA || item->_instruction == CSYNC_INSTRUCTION_NONE)) {
index da9d8435e9293adde173a0bcb29399d6a02e702b..c0984d55ee731924de9be4f4dddf8228b7addd9e 100644 (file)
@@ -429,7 +429,9 @@ void PropagateDownloadFile::startAfterIsEncryptedIsChecked()
         qCDebug(lcPropagateDownload) << "dehydrating file" << _item->_file;
         _item->_type = ItemTypeVirtualFile; // Needed?
         vfs->dehydratePlaceholder(*_item);
-        propagator()->_journal->deleteFileRecord(_item->_file);
+        propagator()->_journal->deleteFileRecord(_item->_originalFile);
+        if (!_item->_renameTarget.isEmpty())
+            _item->_file = _item->_renameTarget;
         updateMetadata(false);
         return;
     }
index 48682671097031ddbd949d8dc6924478d94a9f4c..6e0fe86c4909f27cbb5a235726bd45e39532a245 100644 (file)
@@ -197,6 +197,8 @@ public:
 
     // Variables useful for everybody
     QString _file;
+    // for renames: the name _file should be renamed to
+    // for dehydrations: the name _file should become after dehydration (like adding a suffix)
     QString _renameTarget;
 
     /// Whether there's end to end encryption on this file.
index ca5da6d250425c33227767baefbeabb1e4432457..daf20dd83f41dc71ffdf62b291c42b348528603d 100644 (file)
@@ -74,7 +74,7 @@ void VfsSuffix::dehydratePlaceholder(const SyncFileItem &item)
 {
     QFile::remove(_setupParams.filesystemPath + item._file);
     SyncFileItem virtualItem(item);
-    virtualItem._file.append(fileSuffix());
+    virtualItem._file = item._renameTarget;
     createPlaceholder(virtualItem);
 }
 
index afa9f426e39cc2bfdd6ec3e8bea5cb2b6a89b870..b2b3ef239f4db7e7e3a726d3a498270154478955 100644 (file)
@@ -668,9 +668,17 @@ private slots:
             return !fakeFolder.currentLocalState().find(path)
                 && fakeFolder.currentLocalState().find(placeholder);
         };
+        auto hasDehydratedDbEntries = [&](const QString &path) {
+            SyncJournalFileRecord normal, suffix;
+            fakeFolder.syncJournal().getFileRecord(path, &normal);
+            fakeFolder.syncJournal().getFileRecord(path + ".nextcloud", &suffix);
+            return !normal.isValid() && suffix.isValid() && suffix._type == ItemTypeVirtualFile;
+        };
 
         QVERIFY(isDehydrated("A/a1"));
+        QVERIFY(hasDehydratedDbEntries("A/a1"));
         QVERIFY(isDehydrated("A/a2"));
+        QVERIFY(hasDehydratedDbEntries("A/a2"));
 
         QVERIFY(!fakeFolder.currentLocalState().find("B/b1"));
         QVERIFY(!fakeFolder.currentRemoteState().find("B/b1"));
@@ -679,6 +687,7 @@ private slots:
         QVERIFY(!fakeFolder.currentLocalState().find("B/b2"));
         QVERIFY(!fakeFolder.currentRemoteState().find("B/b2"));
         QVERIFY(isDehydrated("B/b3"));
+        QVERIFY(hasDehydratedDbEntries("B/b3"));
         QVERIFY(itemInstruction(completeSpy, "B/b2", CSYNC_INSTRUCTION_REMOVE));
         QVERIFY(itemInstruction(completeSpy, "B/b3.nextcloud", CSYNC_INSTRUCTION_NEW));