Bring back .lnk files on Windows and always treat them as non-virtual files.
authoralex-z <blackslayer4@gmail.com>
Wed, 21 Sep 2022 16:14:03 +0000 (19:14 +0300)
committerallexzander <allexzander@users.noreply.github.com>
Tue, 27 Sep 2022 07:12:03 +0000 (10:12 +0300)
Signed-off-by: alex-z <blackslayer4@gmail.com>
src/csync/vio/csync_vio_local_win.cpp
src/libsync/discovery.cpp
src/libsync/vfs/cfapi/vfs_cfapi.cpp

index 4ddd4f545fa419a024a4e080b9dd0bd5238453f2..dfb33742c64c102c9ab467bc496e78fbd2149264 100644 (file)
@@ -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 */
index 7a59f1fa97cc4e054882982fe9845bc820ea78ef..f627af257cce604a87e2d644e1b4517e74d179db 100644 (file)
@@ -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);
@@ -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 {
@@ -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;
index d201e36c4ac36130f4a5827d375b19004292ad83..3893f6393bf1ea8d3b9e7233a52ece3bf28a4cac 100644 (file)
@@ -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);