Skip to content

Commit

Permalink
Merge pull request #5000 from nextcloud/backport/4968/stable-3.6
Browse files Browse the repository at this point in the history
[stable-3.6] Bring back .lnk files on Windows and always treat them as non-virtual files.
  • Loading branch information
allexzander authored Oct 3, 2022
2 parents f9c8bf4 + f141b3d commit 8d3ea85
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 15 deletions.
3 changes: 1 addition & 2 deletions src/csync/vio/csync_vio_local_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
file_stat->type = ItemTypeDirectory;
} else {
// 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.
file_stat->type = !OCC::FileSystem::isLnkFile(path) ? ItemTypeFile : ItemTypeSoftLink;
file_stat->type = ItemTypeFile;
}

/* Check for the hidden flag */
Expand Down
16 changes: 3 additions & 13 deletions src/libsync/discovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,18 +254,7 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
}
}

#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 isServerEntryWindowsShortcut = !entries.localEntry.isValid() && entries.serverEntry.isValid()
&& !entries.serverEntry.isDirectory && FileSystem::isLnkFile(entries.serverEntry.name);
#else
const bool isServerEntryWindowsShortcut = false;
#endif
const auto isSymlink = entries.localEntry.isSymLink || isServerEntryWindowsShortcut;

if (excluded == CSYNC_NOT_EXCLUDED && !isSymlink) {
if (excluded == CSYNC_NOT_EXCLUDED && !entries.localEntry.isSymLink) {
return false;
} else if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED || excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
emit _discoveryData->silentlyExcluded(path);
Expand All @@ -277,7 +266,7 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
item->_originalFile = path;
item->_instruction = CSYNC_INSTRUCTION_IGNORE;

if (isSymlink) {
if (entries.localEntry.isSymLink) {
/* Symbolic links are ignored. */
item->_errorString = tr("Symbolic links are not supported in syncing.");
} else {
Expand Down Expand Up @@ -640,6 +629,7 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(
if (!localEntry.isValid()
&& item->_type == ItemTypeFile
&& opts._vfs->mode() != Vfs::Off
&& !FileSystem::isLnkFile(item->_file)
&& _pinState != PinState::AlwaysLocal
&& !FileSystem::isExcludeFile(item->_file)) {
item->_type = ItemTypeVirtualFile;
Expand Down
5 changes: 5 additions & 0 deletions src/libsync/vfs/cfapi/vfs_cfapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,11 @@ Result<void, QString> VfsCfApi::dehydratePlaceholder(const SyncFileItem &item)

Result<Vfs::ConvertToPlaceholderResult, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
{
if (item._type != ItemTypeDirectory && OCC::FileSystem::isLnkFile(filename)) {
qCInfo(lcCfApi) << "File \"" << filename << "\" is a Windows shortcut. Not converting it to a placeholder.";
return Vfs::ConvertToPlaceholderResult::Ok;
}

const auto localPath = QDir::toNativeSeparators(filename);
const auto replacesPath = QDir::toNativeSeparators(replacesFile);

Expand Down

0 comments on commit 8d3ea85

Please sign in to comment.