mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-26 22:35:55 +03:00
Ignore *.lnk files on Windows.
Signed-off-by: allexzander <blackslayer4@gmail.com>
This commit is contained in:
parent
13f4bb541d
commit
cb8b6ccd9b
3 changed files with 23 additions and 14 deletions
|
@ -180,9 +180,15 @@ void ProcessDirectoryJob::process()
|
||||||
// local stat function.
|
// local stat function.
|
||||||
// Recall file shall not be ignored (#4420)
|
// Recall file shall not be ignored (#4420)
|
||||||
bool isHidden = e.localEntry.isHidden || (f.first[0] == '.' && f.first != QLatin1String(".sys.admin#recall#"));
|
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,
|
if (handleExcluded(path._target, e.localEntry.name,
|
||||||
e.localEntry.isDirectory || e.serverEntry.isDirectory, isHidden,
|
e.localEntry.isDirectory || e.serverEntry.isDirectory, isHidden,
|
||||||
e.localEntry.isSymLink))
|
e.localEntry.isSymLink || isServerEntrySymLink))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) {
|
if (_queryServer == InBlackList || _discoveryData->isInSelectiveSyncBlackList(path._original)) {
|
||||||
|
@ -509,14 +515,8 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(
|
||||||
if (!localEntry.isValid()
|
if (!localEntry.isValid()
|
||||||
&& item->_type == ItemTypeFile
|
&& item->_type == ItemTypeFile
|
||||||
&& opts._vfs->mode() != Vfs::Off
|
&& opts._vfs->mode() != Vfs::Off
|
||||||
&& _pinState != PinState::AlwaysLocal
|
&& _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
|
|
||||||
) {
|
|
||||||
item->_type = ItemTypeVirtualFile;
|
item->_type = ItemTypeVirtualFile;
|
||||||
|
|
||||||
if (isVfsWithSuffix())
|
if (isVfsWithSuffix())
|
||||||
addVirtualFileSuffix(tmp_path._original);
|
addVirtualFileSuffix(tmp_path._original);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
|
|
||||||
#include "common/asserts.h"
|
#include "common/asserts.h"
|
||||||
#include "common/checksums.h"
|
#include "common/checksums.h"
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include "common/filesystembase.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <csync_exclude.h>
|
#include <csync_exclude.h>
|
||||||
#include "vio/csync_vio_local.h"
|
#include "vio/csync_vio_local.h"
|
||||||
|
@ -305,7 +308,13 @@ void DiscoverySingleLocalDirectoryJob::run() {
|
||||||
i.inode = dirent->inode;
|
i.inode = dirent->inode;
|
||||||
i.isDirectory = dirent->type == ItemTypeDirectory;
|
i.isDirectory = dirent->type == ItemTypeDirectory;
|
||||||
i.isHidden = dirent->is_hidden;
|
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.isVirtualFile = dirent->type == ItemTypeVirtualFile || dirent->type == ItemTypeVirtualFileDownload;
|
||||||
i.type = dirent->type;
|
i.type = dirent->type;
|
||||||
results.push_back(i);
|
results.push_back(i);
|
||||||
|
|
|
@ -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 hasReparsePoint = (ffd->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
|
||||||
const auto hasCloudTag = (ffd->dwReserved0 & IO_REPARSE_TAG_CLOUD) != 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)
|
// 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
|
// if we don't remove the reparse point flag the discovery will end up thinking
|
||||||
// it is a file... let's prevent it
|
// 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) {
|
} else if (isSparseFile && isPinned) {
|
||||||
stat->type = ItemTypeVirtualFileDownload;
|
stat->type = ItemTypeVirtualFileDownload;
|
||||||
return true;
|
return true;
|
||||||
} else if (!isSparseFile && isUnpinned){
|
} else if (!isSparseFile && isUnpinned && !isWindowsShortcut){
|
||||||
if (!FileSystem::isLnkFile(stat->path)) {
|
stat->type = ItemTypeVirtualFileDehydration;
|
||||||
stat->type = ItemTypeVirtualFileDehydration;
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (isSparseFile) {
|
} else if (isSparseFile) {
|
||||||
stat->type = ItemTypeVirtualFile;
|
stat->type = ItemTypeVirtualFile;
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in a new issue