From efd627bb20c5ea3ba1aaef51948e6f6271afe7fd Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Tue, 1 Feb 2022 20:26:33 -0700 Subject: [PATCH 1/3] cp: only allow directory for -t --- src/uu/cp/src/cp.rs | 6 ++++++ tests/by-util/test_cp.rs | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index a4a512d6b..36916aef1 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -315,6 +315,12 @@ pub fn uu_app<'a>() -> App<'a> { .long(options::TARGET_DIRECTORY) .value_name(options::TARGET_DIRECTORY) .takes_value(true) + .validator(|s| { + if Path::new(s).is_dir() { + return Ok(()); + } + Err("must specify a directory") + }) .help("copy all SOURCE arguments into target-directory")) .arg(Arg::new(options::NO_TARGET_DIRECTORY) .short('T') diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 9ee76bb5e..443e67557 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -183,6 +183,16 @@ fn test_cp_arg_no_target_directory() { .stderr_contains("cannot overwrite directory"); } +#[test] +fn test_cp_target_directory_is_file() { + new_ucmd!() + .arg("-t") + .arg(TEST_HOW_ARE_YOU_SOURCE) + .arg(TEST_HELLO_WORLD_SOURCE) + .fails() + .stderr_contains("must specify a directory"); +} + #[test] fn test_cp_arg_interactive() { new_ucmd!() From 979909e3714aed5d11ce3203ece76bc0fe527a77 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Mon, 7 Feb 2022 20:06:27 -0700 Subject: [PATCH 2/3] cp: better error message for target-directory --- src/uu/cp/src/cp.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 36916aef1..b94953fdf 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -319,7 +319,7 @@ pub fn uu_app<'a>() -> App<'a> { if Path::new(s).is_dir() { return Ok(()); } - Err("must specify a directory") + Err(format!("'{}' is not a directory", s)) }) .help("copy all SOURCE arguments into target-directory")) .arg(Arg::new(options::NO_TARGET_DIRECTORY) From f40fecf86d9365d17af1f6703cde1f5cbd3b9b03 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Mon, 28 Feb 2022 23:30:29 -0700 Subject: [PATCH 3/3] Add UError impl for clap::Error --- src/uu/cp/src/cp.rs | 2 +- src/uucore/src/lib/mods/error.rs | 11 +++++++++++ tests/by-util/test_cp.rs | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index b94953fdf..edd4f1bf2 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -475,7 +475,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { LONG_HELP, backup_control::BACKUP_CONTROL_LONG_HELP )) - .get_matches_from(args); + .try_get_matches_from(args)?; let options = Options::from_matches(&matches)?; diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index ba7722f1c..15d53233e 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -50,6 +50,7 @@ // spell-checker:ignore uioerror +use clap; use std::{ error::Error, fmt::{Display, Formatter}, @@ -615,3 +616,13 @@ impl From for Box { ExitCode::new(i) } } + +/// Implementations for clap::Error +impl UError for clap::Error { + fn code(&self) -> i32 { + match self.kind { + clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => 0, + _ => 1, + } + } +} diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 443e67557..11afa469e 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -190,7 +190,7 @@ fn test_cp_target_directory_is_file() { .arg(TEST_HOW_ARE_YOU_SOURCE) .arg(TEST_HELLO_WORLD_SOURCE) .fails() - .stderr_contains("must specify a directory"); + .stderr_contains(format!("'{}' is not a directory", TEST_HOW_ARE_YOU_SOURCE)); } #[test]