diff --git a/src/uu/mv/locales/en-US.ftl b/src/uu/mv/locales/en-US.ftl index fda4ea2246e..ffd1e73c34d 100644 --- a/src/uu/mv/locales/en-US.ftl +++ b/src/uu/mv/locales/en-US.ftl @@ -31,6 +31,7 @@ mv-error-extra-operand = mv: extra operand {$operand} mv-error-backup-might-destroy-source = backing up {$target} might destroy source; {$source} not moved mv-error-will-not-overwrite-just-created = will not overwrite just-created '{$target}' with '{$source}' mv-error-not-replacing = not replacing {$target} +mv-error-cannot-overwrite = cannot overwrite {$target} mv-error-cannot-move = cannot move {$source} to {$target} mv-error-directory-not-empty = Directory not empty mv-error-dangling-symlink = can't determine symlink type, since it is dangling diff --git a/src/uu/mv/locales/fr-FR.ftl b/src/uu/mv/locales/fr-FR.ftl index 2288e95f51a..174634e8cd8 100644 --- a/src/uu/mv/locales/fr-FR.ftl +++ b/src/uu/mv/locales/fr-FR.ftl @@ -31,6 +31,7 @@ mv-error-extra-operand = mv : opérande supplémentaire {$operand} mv-error-backup-might-destroy-source = sauvegarder {$target} pourrait détruire la source ; {$source} non déplacé mv-error-will-not-overwrite-just-created = ne va pas écraser le fichier qui vient d'être créé '{$target}' avec '{$source}' mv-error-not-replacing = ne remplace pas {$target} +mv-error-cannot-overwrite = impossible d'écraser ${target} mv-error-cannot-move = impossible de déplacer {$source} vers {$target} mv-error-directory-not-empty = Répertoire non vide mv-error-dangling-symlink = impossible de déterminer le type de lien symbolique, car il est suspendu diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 723875f615f..6e3daad5d84 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -675,9 +675,9 @@ fn move_files_into_dir(files: &[PathBuf], target_dir: &Path, options: &Options) ) { Err(e) if e.to_string().is_empty() => set_exit_code(1), Err(e) => { - let e = e.map_err_context(|| { - translate!("mv-error-cannot-move", "source" => sourcepath.quote(), "target" => targetpath.quote()) - }); + let e = e.map_err_context( + || translate!("mv-error-cannot-overwrite", "target" => targetpath.quote()), + ); match display_manager { Some(ref pb) => pb.suspend(|| show!(e)), None => show!(e), diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index f28fc8c28a6..d3ba4e13a39 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -1427,6 +1427,46 @@ fn test_mv_overwrite_nonempty_dir() { assert!(at.dir_exists(dir_b)); } +#[test] +fn test_mv_overwrite_nonempty_dir_error() { + let (at, mut ucmd) = at_and_ucmd!(); + let dir_a = "test_mv_overwrite_nonempty_dir_error_a"; + let dir_b = "test_mv_overwrite_nonempty_dir_error_b"; + let shared_dir = "dir"; + let dummy_dir_a = &format!("{dir_a}/{shared_dir}"); + + let dummy_dir_b = { + // for Windows OS which uses back slash for paths on + // err msg + #[cfg(not(unix))] + { + &format!("{dir_b}\\{shared_dir}") + } + // for Unix OS which uses forward slash for paths on + // err msg + #[cfg(unix)] + { + &format!("{dir_b}/{shared_dir}") + } + }; + let dummy_file = &format!("{dir_b}/{shared_dir}/file"); + + at.mkdir(dir_a); + at.mkdir(dummy_dir_a); + at.mkdir(dir_b); + at.mkdir(dummy_dir_b); + at.touch(dummy_file); + + // Not same error as GNU; the error message is a rust builtin as mentioned in + // https://github.com/uutils/coreutils/issues/5102 + // Current: "mv: cannot overwrite: A non-empty directory: 'b' exists at destination" + // GNU: "mv: cannot overwrite 'b': Directory not empty" + + ucmd.arg(dummy_dir_a).arg(dir_b).fails().stderr_is(format!( + "mv: cannot overwrite '{dummy_dir_b}': Directory not empty\n" + )); +} + #[test] fn test_mv_backup_dir() { let (at, mut ucmd) = at_and_ucmd!();