Bladeren bron

Fix Linux `move_to_trash` wrongly reporting files as not found

We can't rely on the error code from `gio` or `kioclient5`, in my
rudimentary testing they return `1` for both missing files and other
situations like not having a Trash can on the mounted volume.

Fixes #79108.
Rémi Verschelde 2 jaren geleden
bovenliggende
commit
a6e75f3971
1 gewijzigde bestanden met toevoegingen van 11 en 23 verwijderingen
  1. 11 23
      platform/linuxbsd/os_linuxbsd.cpp

+ 11 - 23
platform/linuxbsd/os_linuxbsd.cpp

@@ -954,45 +954,33 @@ static String get_mountpoint(const String &p_path) {
 }
 
 Error OS_LinuxBSD::move_to_trash(const String &p_path) {
-	String path = p_path.rstrip("/"); // Strip trailing slash when path points to a directory
+	// We try multiple methods, until we find one that works.
+	// So we only return on success until we exhausted possibilities.
 
+	String path = p_path.rstrip("/"); // Strip trailing slash when path points to a directory.
 	int err_code;
 	List<String> args;
 	args.push_back(path);
-	args.push_front("trash"); // The command is `gio trash <file_name>` so we need to add it to args.
+
+	args.push_front("trash"); // The command is `gio trash <file_name>` so we add it before the path.
 	Error result = execute("gio", args, nullptr, &err_code); // For GNOME based machines.
-	if (result == OK) { // The `execute` function has done its job without errors.
-		if (!err_code) { // The shell command has been executed without errors.
-			return OK;
-		} else if (err_code == 1) {
-			ERR_PRINT("move_to_trash: No such file or directory as " + path + ".");
-			return ERR_FILE_NOT_FOUND;
-		}
+	if (result == OK && err_code == 0) { // Success.
+		return OK;
 	}
 
 	args.pop_front();
 	args.push_front("move");
 	args.push_back("trash:/"); // The command is `kioclient5 move <file_name> trash:/`.
 	result = execute("kioclient5", args, nullptr, &err_code); // For KDE based machines.
-	if (result == OK) { // The `execute` function has done its job without errors.
-		if (!err_code) { // The shell command has been executed without errors.
-			return OK;
-		} else if (err_code == 1) {
-			ERR_PRINT("move_to_trash: No such file or directory as " + path + ".");
-			return ERR_FILE_NOT_FOUND;
-		}
+	if (result == OK && err_code == 0) {
+		return OK;
 	}
 
 	args.pop_front();
 	args.pop_back();
 	result = execute("gvfs-trash", args, nullptr, &err_code); // For older Linux machines.
-	if (result == OK) { // The `execute` function has done its job without errors.
-		if (!err_code) { // The shell command has been executed without errors.
-			return OK;
-		} else if (err_code == 1) {
-			ERR_PRINT("move_to_trash: No such file or directory as " + path + ".");
-			return ERR_FILE_NOT_FOUND;
-		}
+	if (result == OK && err_code == 0) {
+		return OK;
 	}
 
 	// If the commands `kioclient5`, `gio` or `gvfs-trash` don't work on the system we do it manually.