mirror of
https://github.com/nushell/nushell
synced 2024-11-15 17:27:58 +00:00
Fix mv
error message issues (arrows, Windows paths) (#7197)
# Description BEFORE (notice Windows paths look wrong): ``` 〉mv 8 9 Error: × Destination file already exists ╭─[entry #22:1:1] 1 │ mv 8 9 · ┬ · ╰── you can use -f, --force to force overwriting the destination ╰──── 〉mv d1 tmp Error: × Can't move "C:\\Users\\Leon\\TODO\\d1" to "C:\\Users\\Leon\\TODO\\tmp\\d1" ╭─[entry #19:1:1] 1 │ mv d1 tmp · ─┬─ · ╰── Directory not empty ╰──── ``` AFTER (full paths are now included in the arrows' messages to make lines like `mv $foo` entirely unambiguous): ``` 〉mv 8 9 Error: × Destination file already exists ╭─[entry #4:1:1] 1 │ mv 8 9 · ┬ · ╰── Destination file 'C:\Users\Leon\TODO\tmp\9' already exists ╰──── help: you can use -f, --force to force overwriting the destination 〉mv d1 tmp Error: × Can't move 'C:\Users\Leon\TODO\d1' to 'C:\Users\Leon\TODO\tmp\d1' ╭─[entry #3:1:1] 1 │ mv d1 tmp · ─┬─ · ╰── Directory 'C:\Users\Leon\TODO\tmp' is not empty ╰──── ``` # User-Facing Changes See above. # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace --features=extra -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace --features=extra` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
This commit is contained in:
parent
b662c2eb96
commit
a0b3a48e8b
2 changed files with 20 additions and 8 deletions
|
@ -107,9 +107,15 @@ impl Command for Mv {
|
|||
if destination.exists() && !force && !destination.is_dir() && !source.is_dir() {
|
||||
return Err(ShellError::GenericError(
|
||||
"Destination file already exists".into(),
|
||||
"you can use -f, --force to force overwriting the destination".into(),
|
||||
// These messages all use to_string_lossy() because
|
||||
// showing the full path reduces misinterpretation of the message.
|
||||
// Also, this is preferable to {:?} because that renders Windows paths incorrectly.
|
||||
format!(
|
||||
"Destination file '{}' already exists",
|
||||
destination.to_string_lossy()
|
||||
),
|
||||
Some(spanned_destination.span),
|
||||
None,
|
||||
Some("you can use -f, --force to force overwriting the destination".into()),
|
||||
Vec::new(),
|
||||
));
|
||||
}
|
||||
|
@ -119,20 +125,26 @@ impl Command for Mv {
|
|||
{
|
||||
return Err(ShellError::GenericError(
|
||||
"Can only move multiple sources if destination is a directory".into(),
|
||||
"destination must be a directory when multiple sources".into(),
|
||||
"destination must be a directory when moving multiple sources".into(),
|
||||
Some(spanned_destination.span),
|
||||
None,
|
||||
Vec::new(),
|
||||
));
|
||||
}
|
||||
|
||||
// This is the case where you move a directory A to the interior of directory B, but directory B
|
||||
// already has a non-empty directory named A.
|
||||
if source.is_dir() && destination.is_dir() {
|
||||
if let Some(name) = source.file_name() {
|
||||
let dst = destination.join(name);
|
||||
if dst.is_dir() {
|
||||
return Err(ShellError::GenericError(
|
||||
format!("Can't move {:?} to {:?}", source, dst),
|
||||
"Directory not empty".into(),
|
||||
format!(
|
||||
"Can't move '{}' to '{}'",
|
||||
source.to_string_lossy(),
|
||||
dst.to_string_lossy()
|
||||
),
|
||||
format!("Directory '{}' is not empty", destination.to_string_lossy()),
|
||||
Some(spanned_destination.span),
|
||||
None,
|
||||
Vec::new(),
|
||||
|
@ -148,8 +160,8 @@ impl Command for Mv {
|
|||
if let Some(Ok(filename)) = some_if_source_is_destination {
|
||||
return Err(ShellError::GenericError(
|
||||
format!(
|
||||
"Not possible to move {:?} to itself",
|
||||
filename.file_name().unwrap_or(filename.as_os_str())
|
||||
"Not possible to move '{}' to itself",
|
||||
filename.to_string_lossy()
|
||||
),
|
||||
"cannot move to itself".into(),
|
||||
Some(spanned_destination.span),
|
||||
|
|
|
@ -403,7 +403,7 @@ fn mv_directory_with_same_name() {
|
|||
"#
|
||||
);
|
||||
|
||||
assert!(actual.err.contains("Directory not empty"));
|
||||
assert!(actual.err.contains("is not empty"));
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue