From: Kevin Ottens Date: Tue, 26 Jan 2021 16:50:04 +0000 (+0100) Subject: Don't treat new folders in unpinned folders as files to dehydrate X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~397^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ebfe51b7e7b943cb220217222a4d1df7097fb314;p=nextcloud-desktop.git Don't treat new folders in unpinned folders as files to dehydrate This would only happen if the parent of the newly created folder would be explicitly set to online only, hence why it went under the radar previously. Signed-off-by: Kevin Ottens --- diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.cpp b/src/libsync/vfs/cfapi/vfs_cfapi.cpp index be0eb5f23..baeea51c1 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.cpp +++ b/src/libsync/vfs/cfapi/vfs_cfapi.cpp @@ -187,8 +187,10 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData) // It's a dir with a reparse point due to the placeholder info (hence the cloud tag) // if we don't remove the reparse point flag the discovery will end up thinking // it is a file... let's prevent it - if (isDirectory && hasReparsePoint && hasCloudTag) { - ffd->dwFileAttributes &= ~FILE_ATTRIBUTE_REPARSE_POINT; + if (isDirectory) { + if (hasReparsePoint && hasCloudTag) { + ffd->dwFileAttributes &= ~FILE_ATTRIBUTE_REPARSE_POINT; + } return false; } else if (isSparseFile && isPinned) { stat->type = ItemTypeVirtualFileDownload; diff --git a/test/testsynccfapi.cpp b/test/testsynccfapi.cpp index 30634b1a2..1632e56cb 100644 --- a/test/testsynccfapi.cpp +++ b/test/testsynccfapi.cpp @@ -1067,6 +1067,33 @@ private slots: QCOMPARE(*vfs->pinState("onlinerenamed2/file1rename"), PinState::OnlineOnly); } + void testEmptyFolderInOnlineOnlyRoot() + { + FakeFolder fakeFolder{ FileInfo() }; + setupVfs(fakeFolder); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + ItemCompletedSpy completeSpy(fakeFolder); + + auto cleanup = [&]() { + completeSpy.clear(); + }; + cleanup(); + + // OnlineOnly forced on the root + setPinState(fakeFolder.localPath(), PinState::OnlineOnly, cfapi::NoRecurse); + + // No effect sync + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + cleanup(); + + // Add an empty folder which should propagate + fakeFolder.localModifier().mkdir("A"); + QVERIFY(fakeFolder.syncOnce()); + QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState()); + cleanup(); + } + void testIncompatiblePins() { FakeFolder fakeFolder{ FileInfo() };