Skip to content

Commit 25bb328

Browse files
committed
mv: show file mode in interactive prompt and add translations
1 parent d8e8803 commit 25bb328

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

src/uu/mv/locales/en-US.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ mv-debug-skipped = skipped {$target}
6161
6262
# Prompt messages
6363
mv-prompt-overwrite = overwrite {$target}?
64+
mv-prompt-overriding-mode = overwrite {$target}, overriding mode {$mode} ({$modestr})?
6465
6566
# Progress messages
6667
mv-progress-moving = moving

src/uu/mv/locales/fr-FR.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ mv-debug-skipped = ignoré {$target}
5959
6060
# Messages de confirmation
6161
mv-prompt-overwrite = écraser {$target} ?
62+
mv-prompt-overriding-mode = écraser {$target}, en ignorant le mode {$mode} ({$modestr}) ?
6263
6364
# Messages de progression
6465
mv-progress-moving = déplacement

src/uu/mv/src/mv.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -732,10 +732,33 @@ fn rename(
732732
return Ok(());
733733
}
734734
OverwriteMode::Interactive => {
735-
if !prompt_yes!(
736-
"{}",
737-
translate!("mv-prompt-overwrite", "target" => to.quote())
738-
) {
735+
let mut msg = translate!("mv-prompt-overwrite", "target" => to.quote());
736+
737+
#[cfg(unix)]
738+
{
739+
use libc::mode_t;
740+
use std::os::unix::fs::PermissionsExt;
741+
742+
if let Ok(meta) = fs::metadata(to) {
743+
let mode = meta.permissions().mode() & 0o777;
744+
745+
// Check if the owner's write bit (0o200) is missing
746+
if (mode & 0o200) == 0 {
747+
let octal_mode = format!("{mode:04o}");
748+
// Prepend Zero-Width Non-Joiner (\u{200c}) to stop Fluent from formatting it as a number
749+
let mode_string = format!("\u{200c}{octal_mode}");
750+
751+
msg = translate!(
752+
"mv-prompt-overriding-mode",
753+
"target" => to.quote(),
754+
"mode" => mode_string,
755+
"modestr" => uucore::fs::display_permissions_unix(mode as mode_t, false)
756+
);
757+
}
758+
}
759+
}
760+
761+
if !prompt_yes!("{}", msg) {
739762
return Err(io::Error::other(""));
740763
}
741764
}

0 commit comments

Comments
 (0)