Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/desktop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libsync/discovery.cpp16
-rw-r--r--src/libsync/discoveryphase.cpp11
-rw-r--r--src/libsync/vfs/cfapi/vfs_cfapi.cpp10
3 files changed, 23 insertions, 14 deletions
diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp
index 9c3f2d9d0..636e64c9d 100644
--- a/src/libsync/discovery.cpp
+++ b/src/libsync/discovery.cpp
@@ -180,9 +180,15 @@ void ProcessDirectoryJob::process()
// local stat function.
// Recall file shall not be ignored (#4420)
bool isHidden = e.localEntry.isHidden || (f.first[0] == '.' && f.first != QLatin1String(".sys.admin#recall#"));
+#ifdef Q_OS_WIN
+ // exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
+ const bool isServerEntrySymLink = !e.localEntry.isValid() && e.serverEntry.isValid() && !e.serverEntry.isDirectory && FileSystem::isLnkFile(e.serverEntry.name);
+#else
+ const bool isServerEntrySymLink = false;
+#endif
if (handleExcluded(path._target, e.localEntry.name,
e.localEntry.isDirectory || e.serverEntry.isDirectory, isHidden,
- e.localEntry.isSymLink))
+ e.localEntry.isSymLink || isServerEntrySymLink))
continue;
if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) {
@@ -509,14 +515,8 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(
if (!localEntry.isValid()
&& item->_type == ItemTypeFile
&& opts._vfs->mode() != Vfs::Off
- && _pinState != PinState::AlwaysLocal
-#ifdef Q_OS_WIN
- // on Windows, ".lnk" files are causing troubles with QFileInfo - always treat them as normal files
- && !FileSystem::isLnkFile(path._server)
-#endif
- ) {
+ && _pinState != PinState::AlwaysLocal) {
item->_type = ItemTypeVirtualFile;
-
if (isVfsWithSuffix())
addVirtualFileSuffix(tmp_path._original);
}
diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp
index c8b522dcf..5cb1c7c55 100644
--- a/src/libsync/discoveryphase.cpp
+++ b/src/libsync/discoveryphase.cpp
@@ -20,6 +20,9 @@
#include "common/asserts.h"
#include "common/checksums.h"
+#ifdef Q_OS_WIN
+#include "common/filesystembase.h"
+#endif
#include <csync_exclude.h>
#include "vio/csync_vio_local.h"
@@ -305,7 +308,13 @@ void DiscoverySingleLocalDirectoryJob::run() {
i.inode = dirent->inode;
i.isDirectory = dirent->type == ItemTypeDirectory;
i.isHidden = dirent->is_hidden;
- i.isSymLink = dirent->type == ItemTypeSoftLink;
+#ifdef Q_OS_WIN
+ // exclude ".lnk" files as they are not essential, but, causing troubles when enabling the VFS due to QFileInfo::isDir() and other methods are freezing, which causes the ".lnk" files to start hydrating and freezing the app eventually.
+ const bool isWindowsShortcut = dirent->type == ItemTypeFile && FileSystem::isLnkFile(i.name);
+#else
+ const bool isWindowsShortcut = false;
+#endif
+ i.isSymLink = dirent->type == ItemTypeSoftLink || isWindowsShortcut;
i.isVirtualFile = dirent->type == ItemTypeVirtualFile || dirent->type == ItemTypeVirtualFileDownload;
i.type = dirent->type;
results.push_back(i);
diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.cpp b/src/libsync/vfs/cfapi/vfs_cfapi.cpp
index d8b96cb41..dcd75d46d 100644
--- a/src/libsync/vfs/cfapi/vfs_cfapi.cpp
+++ b/src/libsync/vfs/cfapi/vfs_cfapi.cpp
@@ -184,6 +184,8 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData)
const auto hasReparsePoint = (ffd->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
const auto hasCloudTag = (ffd->dwReserved0 & IO_REPARSE_TAG_CLOUD) != 0;
+ const auto isWindowsShortcut = !isDirectory && FileSystem::isLnkFile(stat->path);
+
// 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
@@ -195,11 +197,9 @@ bool VfsCfApi::statTypeVirtualFile(csync_file_stat_t *stat, void *statData)
} else if (isSparseFile && isPinned) {
stat->type = ItemTypeVirtualFileDownload;
return true;
- } else if (!isSparseFile && isUnpinned){
- if (!FileSystem::isLnkFile(stat->path)) {
- stat->type = ItemTypeVirtualFileDehydration;
- return true;
- }
+ } else if (!isSparseFile && isUnpinned && !isWindowsShortcut){
+ stat->type = ItemTypeVirtualFileDehydration;
+ return true;
} else if (isSparseFile) {
stat->type = ItemTypeVirtualFile;
return true;