From 4173f33bbf4dbef8166ffe15e7ea8bed8064d374 Mon Sep 17 00:00:00 2001 From: lashman Date: Fri, 27 Feb 2026 23:36:14 +0200 Subject: [PATCH] Auto-fix executable permissions on discovered AppImages --- src/core/discovery.rs | 9 ++++++++- src/ui/drop_dialog.rs | 13 +++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/core/discovery.rs b/src/core/discovery.rs index 29616e8..73c6d77 100644 --- a/src/core/discovery.rs +++ b/src/core/discovery.rs @@ -106,7 +106,14 @@ fn scan_directory(dir: &Path) -> Vec { .map(|n| n.to_string_lossy().into_owned()) .unwrap_or_default(); - let is_executable = metadata.permissions().mode() & 0o111 != 0; + let mut is_executable = metadata.permissions().mode() & 0o111 != 0; + if !is_executable { + let perms = std::fs::Permissions::from_mode(0o755); + if std::fs::set_permissions(&path, perms).is_ok() { + is_executable = true; + log::info!("Auto-fixed executable permission: {}", path.display()); + } + } let modified_time = metadata.modified().ok(); results.push(DiscoveredAppImage { diff --git a/src/ui/drop_dialog.rs b/src/ui/drop_dialog.rs index 3627001..4b3f310 100644 --- a/src/ui/drop_dialog.rs +++ b/src/ui/drop_dialog.rs @@ -193,6 +193,19 @@ fn register_dropped_files( }); let final_path = if in_scan_dir { + // Ensure executable even if already in scan dir + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + if let Ok(meta) = std::fs::metadata(file) { + if meta.permissions().mode() & 0o111 == 0 { + let perms = std::fs::Permissions::from_mode(0o755); + if let Err(e) = std::fs::set_permissions(file, perms) { + log::warn!("Failed to set executable on {}: {}", file.display(), e); + } + } + } + } file.clone() } else { let filename = file