From a3c766a5bd53c2a494bef60195371bf38ed9c984 Mon Sep 17 00:00:00 2001 From: Shekhar Date: Fri, 26 Dec 2025 00:04:24 +0530 Subject: [PATCH 1/2] mv: show file mode in interactive prompt and add translations --- src/uu/mv/locales/en-US.ftl | 1 + src/uu/mv/locales/fr-FR.ftl | 1 + src/uu/mv/src/mv.rs | 31 +++++++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/uu/mv/locales/en-US.ftl b/src/uu/mv/locales/en-US.ftl index fda4ea2246e..8f2b909286a 100644 --- a/src/uu/mv/locales/en-US.ftl +++ b/src/uu/mv/locales/en-US.ftl @@ -61,6 +61,7 @@ mv-debug-skipped = skipped {$target} # Prompt messages mv-prompt-overwrite = overwrite {$target}? +mv-prompt-overriding-mode = overwrite {$target}, overriding mode {$mode} ({$mode_str})? # Progress messages mv-progress-moving = moving diff --git a/src/uu/mv/locales/fr-FR.ftl b/src/uu/mv/locales/fr-FR.ftl index 2288e95f51a..dd4871bae6c 100644 --- a/src/uu/mv/locales/fr-FR.ftl +++ b/src/uu/mv/locales/fr-FR.ftl @@ -59,6 +59,7 @@ mv-debug-skipped = ignoré {$target} # Messages de confirmation mv-prompt-overwrite = écraser {$target} ? +mv-prompt-overriding-mode = écraser {$target}, en ignorant le mode {$mode} ({$mode_str}) ? # Messages de progression mv-progress-moving = déplacement diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 723875f615f..49e3e0d4c7a 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -732,10 +732,33 @@ fn rename( return Ok(()); } OverwriteMode::Interactive => { - if !prompt_yes!( - "{}", - translate!("mv-prompt-overwrite", "target" => to.quote()) - ) { + let mut msg = translate!("mv-prompt-overwrite", "target" => to.quote()); + + #[cfg(unix)] + { + use libc::mode_t; + use std::os::unix::fs::PermissionsExt; + + if let Ok(meta) = fs::metadata(to) { + let mode = meta.permissions().mode() & 0o777; + + // Check if the owner's write bit (0o200) is missing + if (mode & 0o200) == 0 { + let octal_mode = format!("{mode:04o}"); + // Prepend Zero-Width Non-Joiner (\u{200c}) to stop Fluent from formatting it as a number + let mode_string = format!("\u{200c}{octal_mode}"); + + msg = translate!( + "mv-prompt-overriding-mode", + "target" => to.quote(), + "mode" => mode_string, + "mode_str" => uucore::fs::display_permissions_unix(mode as mode_t, false) + ); + } + } + } + + if !prompt_yes!("{}", msg) { return Err(io::Error::other("")); } } From 4439ecfc872a149b1277f04a45a3bc186a894d3d Mon Sep 17 00:00:00 2001 From: Shekhar Date: Fri, 26 Dec 2025 01:33:58 +0530 Subject: [PATCH 2/2] fix: remove unused mutation for windows/clippy --- src/uu/mv/src/mv.rs | 57 +++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 49e3e0d4c7a..0ac5caacc1b 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -732,31 +732,42 @@ fn rename( return Ok(()); } OverwriteMode::Interactive => { - let mut msg = translate!("mv-prompt-overwrite", "target" => to.quote()); - - #[cfg(unix)] - { - use libc::mode_t; - use std::os::unix::fs::PermissionsExt; - - if let Ok(meta) = fs::metadata(to) { - let mode = meta.permissions().mode() & 0o777; - - // Check if the owner's write bit (0o200) is missing - if (mode & 0o200) == 0 { - let octal_mode = format!("{mode:04o}"); - // Prepend Zero-Width Non-Joiner (\u{200c}) to stop Fluent from formatting it as a number - let mode_string = format!("\u{200c}{octal_mode}"); - - msg = translate!( - "mv-prompt-overriding-mode", - "target" => to.quote(), - "mode" => mode_string, - "mode_str" => uucore::fs::display_permissions_unix(mode as mode_t, false) - ); + // We assign 'msg' the result of this block + let msg = { + let default_msg = translate!("mv-prompt-overwrite", "target" => to.quote()); + + #[cfg(unix)] + { + use libc::mode_t; + use std::os::unix::fs::PermissionsExt; + + // We use an 'if let' as an expression here + if let Ok(meta) = fs::metadata(to) { + let mode = meta.permissions().mode() & 0o777; + if (mode & 0o200) == 0 { + let octal_mode = format!("{mode:04o}"); + let mode_string = format!("\u{200c}{octal_mode}"); + + // This is the "return" value of the inner block + translate!( + "mv-prompt-overriding-mode", + "target" => to.quote(), + "mode" => mode_string, + "mode_str" => uucore::fs::display_permissions_unix(mode as mode_t, false) + ) + } else { + default_msg + } + } else { + default_msg } } - } + + #[cfg(not(unix))] + { + default_msg + } + }; if !prompt_yes!("{}", msg) { return Err(io::Error::other(""));