From 8bfd96fb598d276f37259f312df4e01061793bf3 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 25 Sep 2022 17:09:01 -0400 Subject: [PATCH] cp: correct error message on copying dir to itself Correct the error message produced when attempting to copy a directory into itself with `cp`. Before this commit, the error message was $ cp -R d d cp: cannot copy a directory, 'd', into itself, 'd' After this commit, the error message is $ cp -R d d cp: cannot copy a directory, 'd', into itself, 'd/d' --- src/uu/cp/src/cp.rs | 2 +- tests/by-util/test_cp.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index ef8fb93ec3b..4772a642472 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -1092,7 +1092,7 @@ fn copy_directory( return Err(format!( "cannot copy a directory, {}, into itself, {}", root.quote(), - target.quote() + target.join(root.file_name().unwrap()).quote() ) .into()); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 45b33157663..94bf17026d3 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -2095,3 +2095,31 @@ fn test_cp_mode_hardlink_no_dereference() { assert!(at.symlink_exists("z")); assert_eq!(at.read_symlink("z"), "slink"); } + +/// Test that copying a directory to itself is disallowed. +#[test] +fn test_copy_directory_to_itself_disallowed() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("d"); + #[cfg(not(windows))] + let expected = "cp: cannot copy a directory, 'd', into itself, 'd/d'"; + #[cfg(windows)] + let expected = "cp: cannot copy a directory, 'd', into itself, 'd\\d'"; + ucmd.args(&["-R", "d", "d"]).fails().stderr_only(expected); +} + +/// Test that copying a nested directory to itself is disallowed. +#[test] +fn test_copy_nested_directory_to_itself_disallowed() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("a"); + at.mkdir("a/b"); + at.mkdir("a/b/c"); + #[cfg(not(windows))] + let expected = "cp: cannot copy a directory, 'a/b', into itself, 'a/b/c/b'"; + #[cfg(windows)] + let expected = "cp: cannot copy a directory, 'a/b', into itself, 'a/b/c\\b'"; + ucmd.args(&["-R", "a/b", "a/b/c"]) + .fails() + .stderr_only(expected); +}