Return error when moving a source directory to a target directory which contains a subdirectory with the same name as the source (#6284)

Fixes #6275

Signed-off-by: nibon7 <nibon7@163.com>
This commit is contained in:
nibon7 2022-08-10 19:51:11 +08:00 committed by GitHub
parent 0e5886ace1
commit 271fda7c91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 0 deletions

View File

@ -120,6 +120,21 @@ impl Command for Mv {
));
}
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(),
Some(spanned_destination.span),
None,
Vec::new(),
));
}
}
}
let some_if_source_is_destination = sources
.iter()
.find(|f| matches!(f, Ok(f) if destination.starts_with(f)));

View File

@ -375,3 +375,21 @@ fn mv_ignores_ansi() {
assert_eq!(actual.out, "success.txt");
})
}
#[test]
fn mv_directory_with_same_name() {
Playground::setup("mv_test_directory_with_same_name", |_dirs, sandbox| {
sandbox.mkdir("testdir");
sandbox.mkdir("testdir/testdir");
let cwd = sandbox.cwd().join("testdir");
let actual = nu!(
cwd,
r#"
mv testdir ..
"#
);
assert!(actual.err.contains("Directory not empty"));
})
}