Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package libfm-qt Latest version fixes #926803, missed file monitoring on remote file systems. Without the fix remote filesystems are nearly unusable. Diff: diff --git a/debian/changelog b/debian/changelog index 9bc9b25..54ef4eb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +libfm-qt (0.14.1-9) unstable; urgency=medium + + * Added upstream patch workaround-missed-file-monitoring.patch + (Closes: #926803) + * Added two new symbols - internal use only + + -- Alf Gaida <aga...@siduction.org> Sat, 08 Jun 2019 16:39:11 +0200 + libfm-qt (0.14.1-8) unstable; urgency=medium * Removed the wrongly introduced build dependency on lxqt-qtplugin diff --git a/debian/libfm-qt6.symbols b/debian/libfm-qt6.symbols index d06f805..158bd23 100644 --- a/debian/libfm-qt6.symbols +++ b/debian/libfm-qt6.symbols @@ -531,12 +531,14 @@ libfm-qt.so.6 libfm-qt6 #MINVER# (c++)"Fm::Folder::filesAdded(Fm::FileInfoList&)@Base" 0.12.0 (c++)"Fm::Folder::filesChanged(std::vector<std::pair<std::shared_ptr<Fm::FileInfo const>, std::shared_ptr<Fm::FileInfo const> >, std::allocator<std::pair<std::shared_ptr<Fm::FileInfo const>, std::shared_ptr<Fm::FileInfo const> > > >&)@Base" 0.12.0 (c++)"Fm::Folder::filesRemoved(Fm::FileInfoList&)@Base" 0.12.0 + (c++)"Fm::Folder::findByPath(Fm::FilePath const&)@Base" 0.14.1~ (c++)"Fm::Folder::finishLoading()@Base" 0.12.0 (c++)"Fm::Folder::fromPath(Fm::FilePath const&)@Base" 0.12.0 (c++|arch= !armel !armhf !i386 !mips !mipsel !hppa !hurd-i386 !kfreebsd-i386 !m68k !powerpc !powerpcspe !sh4 !x32 )"Fm::Folder::getFilesystemInfo(unsigned long*, unsigned long*) const@Base" 0.12.0 (c++|arch= !amd64 !arm64 !mips64el !ppc64el !s390x !alpha !ia64 !kfreebsd-amd64 !ppc64 !riscv64 !sparc64 )"Fm::Folder::getFilesystemInfo(unsigned long long*, unsigned long long*) const@Base" 0.12.0 (c++)"Fm::Folder::hadCutFilesUnset()@Base" 0.12.0 (c++)"Fm::Folder::hasCutFiles()@Base" 0.12.0 + (c++)"Fm::Folder::hasFileMonitor() const@Base" 0.14.1~ (c++)"Fm::Folder::info() const@Base" 0.12.0 (c++)"Fm::Folder::isEmpty() const@Base" 0.12.0 (c++)"Fm::Folder::isIncremental() const@Base" 0.12.0 diff --git a/debian/patches/series b/debian/patches/series index 1a4dd71..031051b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -2,3 +2,4 @@ fix-smb-recursive-copy.patch fix-license-headers.patch dont-ignore-crea-del-sequences.patch workaround-glib-recursive-moving-error.patch +workaround-missed-file-monitoring.patch diff --git a/debian/patches/workaround-missed-file-monitoring.patch b/debian/patches/workaround-missed-file-monitoring.patch new file mode 100644 index 0000000..5be3811 --- /dev/null +++ b/debian/patches/workaround-missed-file-monitoring.patch @@ -0,0 +1,143 @@ +Description: Realod folder after transfer job if it lacks file monitoring + Closes https://github.com/lxqt/pcmanfm-qt/issues/933 and closes + https://github.com/lxqt/libfm-qt/issues/280. After a file transfer job is + finished inside a directory, if it is the path of an open folder that lacks + file monitoring, this patch reloads its corresponding folder. In this way, the + lack of file monitoring is partially compensated for. + Please note that this doesn't work with `search://` because the files inside + `search://` don't belong to it. By covering file creation, renaming, moving + from one shared folder to another and deleting after trying to move into Trash. + +Last-Update: 2019-06-08 + +--- libfm-qt-0.14.1.orig/src/core/folder.cpp ++++ libfm-qt-0.14.1/src/core/folder.cpp +@@ -112,6 +112,20 @@ std::shared_ptr<Folder> Folder::fromPath + return folder; + } + ++// static ++// Checks if this is the path of a folder in use. ++std::shared_ptr<Folder> Folder::findByPath(const FilePath& path) { ++ std::lock_guard<std::mutex> lock{mutex_}; ++ auto it = cache_.find(path); ++ if(it != cache_.end()) { ++ auto folder = it->second.lock(); ++ if(folder) { ++ return folder; ++ } ++ } ++ return nullptr; ++} ++ + bool Folder::makeDirectory(const char* /*name*/, GError** /*error*/) { + // TODO: + // FIXME: what the API is used for in the original libfm C API? +@@ -142,6 +156,10 @@ bool Folder::isEmpty() const { + return files_.empty(); + } + ++bool Folder::hasFileMonitor() const { ++ return (dirMonitor_ != nullptr); ++} ++ + FileInfoList Folder::files() const { + FileInfoList ret; + ret.reserve(files_.size()); +--- libfm-qt-0.14.1.orig/src/core/folder.h ++++ libfm-qt-0.14.1/src/core/folder.h +@@ -56,6 +56,8 @@ public: + + static std::shared_ptr<Folder> fromPath(const FilePath& path); + ++ static std::shared_ptr<Folder> findByPath(const FilePath& path); ++ + bool makeDirectory(const char* name, GError** error); + + void queryFilesystemInfo(); +@@ -74,6 +76,8 @@ public: + + bool isEmpty() const; + ++ bool hasFileMonitor() const; ++ + FileInfoList files() const; + + const FilePath& path() const; +--- libfm-qt-0.14.1.orig/src/fileoperation.cpp ++++ libfm-qt-0.14.1/src/fileoperation.cpp +@@ -298,6 +298,8 @@ void FileOperation::onJobFinish() { + } + Q_EMIT finished(); + ++ bool tryReload = true; ++ + // special handling for trash job + if(type_ == Trash && !job_->isCancelled()) { + auto trashJob = static_cast<Fm::TrashJob*>(job_); +@@ -313,6 +315,26 @@ void FileOperation::onJobFinish() { + "Do you want to delete them instead?")) == QMessageBox::Yes) { + deleteFiles(std::move(unsupportedFiles), false); + } ++ tryReload = false; ++ } ++ } ++ ++ // reload the containing folder if it is in use but does not have a file monitor ++ if(tryReload) { ++ if(!srcPaths_.empty() && (type_ == Trash || type_ == Delete || type_ == Move)) { ++ auto parent_path = srcPaths_[0].parent(); ++ if(parent_path != destPath_) { // otherwise, it will be done below ++ auto folder = Fm::Folder::findByPath(parent_path); ++ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { ++ folder->reload(); ++ } ++ } ++ } ++ if(destPath_) { ++ auto folder = Fm::Folder::findByPath(destPath_); ++ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { ++ folder->reload(); ++ } + } + } + +--- libfm-qt-0.14.1.orig/src/utilities.cpp ++++ libfm-qt-0.14.1/src/utilities.cpp +@@ -157,7 +157,8 @@ bool isCurrentPidClipboardData(const QMi + } + + bool changeFileName(const Fm::FilePath& filePath, const QString& newName, QWidget* parent, bool showMessage) { +- auto dest = filePath.parent().child(newName.toLocal8Bit().constData()); ++ auto parent_path = filePath.parent(); ++ auto dest = parent_path.child(newName.toLocal8Bit().constData()); + Fm::GErrorPtr err; + if(!g_file_move(filePath.gfile().get(), dest.gfile().get(), + GFileCopyFlags(G_FILE_COPY_ALL_METADATA | +@@ -170,6 +171,13 @@ bool changeFileName(const Fm::FilePath& + } + return false; + } ++ ++ // reload the containing folder if it is in use but does not have a file monitor ++ auto folder = Fm::Folder::findByPath(parent_path); ++ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { ++ folder->reload(); ++ } ++ + return true; + } + +@@ -263,6 +271,12 @@ _retry: + + QMessageBox::critical(parent ? parent->window() : nullptr, QObject::tr("Error"), err.message()); + } ++ else { // reload the containing folder if it is in use but does not have a file monitor ++ auto folder = Fm::Folder::findByPath(parentDir); ++ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) { ++ folder->reload(); ++ } ++ } + } + + uid_t uidFromName(QString name) { unblock libfm-qt/0.14.1-9 -- System Information: Debian Release: 10.0 APT prefers testing APT policy: (500, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 4.19.0-5-amd64 (SMP w/8 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE= (charmap=UTF-8) Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled