Merge pull request #5788 from cakebaker/mv_same_file

mv: show "same file" error for `mv d/f d`
This commit is contained in:
Sylvestre Ledru 2024-12-02 20:37:41 +01:00 committed by GitHub
commit 527bb6fad8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 1 deletions

View file

@ -314,6 +314,7 @@ fn handle_two_paths(source: &Path, target: &Path, opts: &Options) -> UResult<()>
)
.into());
}
if source.symlink_metadata().is_err() {
return Err(if path_ends_with_terminator(source) {
MvError::CannotStatNotADirectory(source.quote().to_string()).into()
@ -336,6 +337,13 @@ fn handle_two_paths(source: &Path, target: &Path, opts: &Options) -> UResult<()>
}
}
if source.parent() == Some(target) {
return Err(
// use source twice to match GNU's error message
MvError::SameFile(source.quote().to_string(), source.quote().to_string()).into(),
);
}
let target_is_dir = target.is_dir();
let source_is_dir = source.is_dir();

View file

@ -402,7 +402,23 @@ fn test_mv_same_file() {
ucmd.arg(file_a)
.arg(file_a)
.fails()
.stderr_is(format!("mv: '{file_a}' and '{file_a}' are the same file\n",));
.stderr_is(format!("mv: '{file_a}' and '{file_a}' are the same file\n"));
}
#[test]
fn test_mv_file_to_same_dir() {
let (at, mut ucmd) = at_and_ucmd!();
let file = "a";
let dir = "dir";
let path = &format!("{dir}/{file}");
at.mkdir(dir);
at.touch(path);
ucmd.arg(path)
.arg(dir)
.fails()
.stderr_is(format!("mv: '{path}' and '{path}' are the same file\n"));
}
#[test]