parent
e727e901ee
commit
5d2a1fd479
@ -1,115 +0,0 @@
|
|||||||
From 7e79e591eb536603da92ee537bf949490b1259fc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tsu Jan <tsujan2000@gmail.com>
|
|
||||||
Date: Sun, 21 Apr 2019 14:11:14 +0430
|
|
||||||
Subject: [PATCH] Don't ignore creation-deletion sequences
|
|
||||||
|
|
||||||
Fixes https://github.com/lxqt/pcmanfm-qt/issues/944
|
|
||||||
|
|
||||||
Previously, if a file was in addition queue and then it came into the deletion
|
|
||||||
queue, its addition and deletion were both ignored. That was wrong and could
|
|
||||||
result in showing nonexistent files because addition can also happen in
|
|
||||||
directory list job before being processed by file info job.
|
|
||||||
|
|
||||||
Also process accumulated changes only after finishing the current info job and
|
|
||||||
don't clear all deletion paths after processing them (because, logically, only
|
|
||||||
those paths that can be deleted should be removed).
|
|
||||||
---
|
|
||||||
src/core/folder.cpp | 60 +++++++++++++++++++++++----------------------
|
|
||||||
1 file changed, 31 insertions(+), 29 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/core/folder.cpp b/src/core/folder.cpp
|
|
||||||
index 6c2b27d..2385a8b 100644
|
|
||||||
--- a/src/core/folder.cpp
|
|
||||||
+++ b/src/core/folder.cpp
|
|
||||||
@@ -228,16 +228,6 @@ void Folder::onFileInfoFinished() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- // process the changes accumulated during this info job
|
|
||||||
- if(filesystem_info_pending // means a pending change; see "onFileSystemInfoFinished()"
|
|
||||||
- || !paths_to_update.empty() || !paths_to_add.empty() || !paths_to_del.empty()) {
|
|
||||||
- QTimer::singleShot(0, this, &Folder::processPendingChanges);
|
|
||||||
- }
|
|
||||||
- // there's no pending change at the moment; let the next one be processed
|
|
||||||
- else {
|
|
||||||
- has_idle_update_handler = false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
FileInfoList files_to_add;
|
|
||||||
FileInfoList files_to_delete;
|
|
||||||
std::vector<FileInfoPair> files_to_update;
|
|
||||||
@@ -271,6 +261,16 @@ void Folder::onFileInfoFinished() {
|
|
||||||
Q_EMIT filesChanged(files_to_update);
|
|
||||||
}
|
|
||||||
Q_EMIT contentChanged();
|
|
||||||
+
|
|
||||||
+ // process the changes accumulated during this info job
|
|
||||||
+ if(filesystem_info_pending // means a pending change; see "onFileSystemInfoFinished()"
|
|
||||||
+ || !paths_to_update.empty() || !paths_to_add.empty() || !paths_to_del.empty()) {
|
|
||||||
+ QTimer::singleShot(0, this, &Folder::processPendingChanges);
|
|
||||||
+ }
|
|
||||||
+ // there's no pending change at the moment; let the next one be processed
|
|
||||||
+ else {
|
|
||||||
+ has_idle_update_handler = false;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
void Folder::processPendingChanges() {
|
|
||||||
@@ -314,21 +314,24 @@ void Folder::processPendingChanges() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// process deletion
|
|
||||||
- if(!paths_to_del.empty()) {
|
|
||||||
- FileInfoList deleted_files;
|
|
||||||
- for(const auto &path: paths_to_del) {
|
|
||||||
- auto name = path.baseName();
|
|
||||||
- auto it = files_.find(name.get());
|
|
||||||
- if(it != files_.end()) {
|
|
||||||
- deleted_files.push_back(it->second);
|
|
||||||
- files_.erase(it);
|
|
||||||
- }
|
|
||||||
+ FileInfoList deleted_files;
|
|
||||||
+ auto path_it = paths_to_del.begin();
|
|
||||||
+ while(path_it != paths_to_del.end()) {
|
|
||||||
+ const auto& path = *path_it;
|
|
||||||
+ auto name = path.baseName();
|
|
||||||
+ auto it = files_.find(name.get());
|
|
||||||
+ if(it != files_.end()) {
|
|
||||||
+ deleted_files.push_back(it->second);
|
|
||||||
+ files_.erase(it);
|
|
||||||
+ path_it = paths_to_del.erase(path_it);
|
|
||||||
}
|
|
||||||
- if(!deleted_files.empty()) {
|
|
||||||
- Q_EMIT filesRemoved(deleted_files);
|
|
||||||
- Q_EMIT contentChanged();
|
|
||||||
+ else {
|
|
||||||
+ ++path_it;
|
|
||||||
}
|
|
||||||
- paths_to_del.clear();
|
|
||||||
+ }
|
|
||||||
+ if(!deleted_files.empty()) {
|
|
||||||
+ Q_EMIT filesRemoved(deleted_files);
|
|
||||||
+ Q_EMIT contentChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pending_change_notify) {
|
|
||||||
@@ -404,13 +407,12 @@ void Folder::eventFileDeleted(const FilePath& path) {
|
|
||||||
bool deleted = true;
|
|
||||||
// qDebug() << "delete " << path.baseName().get();
|
|
||||||
// G_LOCK(lists);
|
|
||||||
- if(std::find(paths_to_add.cbegin(), paths_to_add.cend(), path) != paths_to_add.cend()) {
|
|
||||||
- // if the file was going to be added, just remove it from the addition queue
|
|
||||||
- paths_to_add.erase(std::remove(paths_to_add.begin(), paths_to_add.end(), path), paths_to_add.cend());
|
|
||||||
- }
|
|
||||||
- else if(std::find(paths_to_del.cbegin(), paths_to_del.cend(), path) == paths_to_del.cend()) {
|
|
||||||
+ /* WARNING: If the file is in the addition queue, we shouldn not remove it from that queue
|
|
||||||
+ and ignore its deletion because it may have been added by the directory list job, in
|
|
||||||
+ which case, ignoring an addition-deletion sequence would result in a nonexistent file. */
|
|
||||||
+ if(std::find(paths_to_del.cbegin(), paths_to_del.cend(), path) == paths_to_del.cend()) {
|
|
||||||
paths_to_del.push_back(path);
|
|
||||||
- // the update queue should be cancelled for a file that is going to be deleted
|
|
||||||
+ // the update queue can be cancelled for a file that is going to be deleted
|
|
||||||
paths_to_update.erase(std::remove(paths_to_update.begin(), paths_to_update.end(), path), paths_to_update.cend());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
|||||||
From 3d23ec7f0857cbc1ae8e42bdd27ab179a7e8344f Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Hong Jen Yee (PCMan)" <pcman.tw@gmail.com>
|
|
||||||
Date: Fri, 19 Apr 2019 01:19:08 +0800
|
|
||||||
Subject: [PATCH] Fix the license header of code we took from libfm (they
|
|
||||||
should use LGPL2 instead of GPL2). - src/core/vfs/vfs-menu.c -
|
|
||||||
src/core/vfs/vfs-search.c These files are taken from libfm which has been
|
|
||||||
relicensed to LGPL 2 on 2014-09-05 by Andrey N. Gritsenko after consulting
|
|
||||||
other contributors.
|
|
||||||
|
|
||||||
---
|
|
||||||
src/core/vfs/vfs-menu.c | 21 ++++++++++-----------
|
|
||||||
src/core/vfs/vfs-search.c | 37 +++++++++++++++++--------------------
|
|
||||||
2 files changed, 27 insertions(+), 31 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/core/vfs/vfs-menu.c b/src/core/vfs/vfs-menu.c
|
|
||||||
index c541159..069b1bc 100644
|
|
||||||
--- a/src/core/vfs/vfs-menu.c
|
|
||||||
+++ b/src/core/vfs/vfs-menu.c
|
|
||||||
@@ -4,20 +4,19 @@
|
|
||||||
*
|
|
||||||
* Copyright 2012-2014 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
|
||||||
*
|
|
||||||
- * This program is free software; you can redistribute it and/or modify
|
|
||||||
- * it under the terms of the GNU General Public License as published by
|
|
||||||
- * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
- * (at your option) any later version.
|
|
||||||
+ * This library is free software; you can redistribute it and/or
|
|
||||||
+ * modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ * License as published by the Free Software Foundation; either
|
|
||||||
+ * version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
- * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
- * GNU General Public License for more details.
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ * Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
- * You should have received a copy of the GNU General Public License
|
|
||||||
- * along with this program; if not, write to the Free Software
|
|
||||||
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
- * MA 02110-1301, USA.
|
|
||||||
+ * You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ * License along with this library; if not, write to the Free Software
|
|
||||||
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
diff --git a/src/core/vfs/vfs-search.c b/src/core/vfs/vfs-search.c
|
|
||||||
index 0a64fb6..92b932c 100644
|
|
||||||
--- a/src/core/vfs/vfs-search.c
|
|
||||||
+++ b/src/core/vfs/vfs-search.c
|
|
||||||
@@ -1,25 +1,22 @@
|
|
||||||
/*
|
|
||||||
- * fm-vfs-search.c
|
|
||||||
- *
|
|
||||||
- * Copyright 2012 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
|
||||||
- * Copyright 2010 Shae Smittle <starfall87@gmail.com>
|
|
||||||
- *
|
|
||||||
- * This program is free software; you can redistribute it and/or modify
|
|
||||||
- * it under the terms of the GNU General Public License as published by
|
|
||||||
- * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
- * (at your option) any later version.
|
|
||||||
- *
|
|
||||||
- * This program is distributed in the hope that it will be useful,
|
|
||||||
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
- * GNU General Public License for more details.
|
|
||||||
- *
|
|
||||||
- * You should have received a copy of the GNU General Public License
|
|
||||||
- * along with this program; if not, write to the Free Software
|
|
||||||
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
- * MA 02110-1301, USA.
|
|
||||||
- *
|
|
||||||
+ * fm-vfs-search.c
|
|
||||||
*
|
|
||||||
+ * Copyright 2012 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
|
||||||
+ * Copyright 2010 Shae Smittle <starfall87@gmail.com>
|
|
||||||
+ *
|
|
||||||
+ * This library is free software; you can redistribute it and/or
|
|
||||||
+ * modify it under the terms of the GNU Lesser General Public
|
|
||||||
+ * License as published by the Free Software Foundation; either
|
|
||||||
+ * version 2.1 of the License, or (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * This library is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
+ * Lesser General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU Lesser General Public
|
|
||||||
+ * License along with this library; if not, write to the Free Software
|
|
||||||
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
From 6cb5f38d2c1261b782b16da45bb323b069db94fe Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tsu Jan <tsujan2000@gmail.com>
|
|
||||||
Date: Mon, 8 Apr 2019 07:13:09 +0430
|
|
||||||
Subject: [PATCH] Fixed SMB recursive copy
|
|
||||||
|
|
||||||
Fixes https://github.com/lxqt/libfm-qt/issues/385 by trying to set dir permissions only once and ignoring possible errors (that happen with SMB and, maybe, other protocols).
|
|
||||||
---
|
|
||||||
src/core/filetransferjob.cpp | 9 +++++----
|
|
||||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/core/filetransferjob.cpp b/src/core/filetransferjob.cpp
|
|
||||||
index 4039c58..6b44576 100644
|
|
||||||
--- a/src/core/filetransferjob.cpp
|
|
||||||
+++ b/src/core/filetransferjob.cpp
|
|
||||||
@@ -279,16 +279,17 @@ bool FileTransferJob::makeDir(const FilePath& srcPath, GFileInfoPtr srcInfo, Fil
|
|
||||||
mode, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
|
||||||
cancellable().get(), &err);
|
|
||||||
if(!chmod_done) {
|
|
||||||
- ErrorAction act = emitError(err, ErrorSeverity::MODERATE);
|
|
||||||
+ /* NOTE: Some filesystems may not support this. So, ignore errors for now. */
|
|
||||||
+ break;
|
|
||||||
+ /*ErrorAction act = emitError(err, ErrorSeverity::MODERATE);
|
|
||||||
if(act != ErrorAction::RETRY) {
|
|
||||||
break;
|
|
||||||
- }
|
|
||||||
- /* FIXME: some filesystems may not support this. */
|
|
||||||
+ }*/
|
|
||||||
}
|
|
||||||
} while(!chmod_done && !isCancelled());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- return mkdir_done && chmod_done;
|
|
||||||
+ return mkdir_done/* && chmod_done*/;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FileTransferJob::handleError(GErrorPtr &err, const FilePath &srcPath, const GFileInfoPtr &srcInfo, FilePath &destPath, int& flags) {
|
|
@ -1,33 +0,0 @@
|
|||||||
From 476dded99de11a57c64103b4610f0de3dbdbc769 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tsu Jan <tsujan2000@gmail.com>
|
|
||||||
Date: Mon, 22 Apr 2019 00:07:07 +0430
|
|
||||||
Subject: [PATCH] Workaround for GLib's recursive moving error, e.g. with bound
|
|
||||||
mounts
|
|
||||||
|
|
||||||
`g_file_move()` may not work recursively on the same filesystem, especially
|
|
||||||
with bound mounts (to `/mnt`, for example) and give the `G_IO_ERROR_WOULD_RECURSE`
|
|
||||||
error. This patch ignores the error and tries our `FileTransferJob::copyFile()`.
|
|
||||||
|
|
||||||
Closes https://github.com/lxqt/pcmanfm-qt/issues/943
|
|
||||||
---
|
|
||||||
src/core/filetransferjob.cpp | 7 +++++++
|
|
||||||
1 file changed, 7 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/core/filetransferjob.cpp b/src/core/filetransferjob.cpp
|
|
||||||
index c3d5851..32f0f89 100644
|
|
||||||
--- a/src/core/filetransferjob.cpp
|
|
||||||
+++ b/src/core/filetransferjob.cpp
|
|
||||||
@@ -83,6 +83,13 @@ bool FileTransferJob::moveFileSameFs(const FilePath& srcPath, const GFileInfoPtr
|
|
||||||
// do the file operation
|
|
||||||
if(!g_file_move(srcPath.gfile().get(), destPath.gfile().get(), GFileCopyFlags(flags), cancellable().get(),
|
|
||||||
nullptr, this, &err)) {
|
|
||||||
+ // Specially with mounts bound to /mnt, g_file_move() may give the recursive error
|
|
||||||
+ // and fail, in which case, we ignore the error and try copying and deleting.
|
|
||||||
+ if(err.code() == G_IO_ERROR_WOULD_RECURSE) {
|
|
||||||
+ if(auto parent = destPath.parent()) {
|
|
||||||
+ return copyFile(srcPath, srcInfo, parent, destPath.baseName().get());
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
retry = handleError(err, srcPath, srcInfo, destPath, flags);
|
|
||||||
}
|
|
||||||
else {
|
|
Loading…
Reference in new issue