From 25ed5eeb0e470b7d1695f9caebee8a192efecc79 Mon Sep 17 00:00:00 2001 From: Matt Blessed Date: Wed, 26 May 2021 10:50:41 -0400 Subject: [PATCH] cp: move option check to uumain and use `show_usage_error` - add test for conflicting options `--backup` and `--no-clobber` --- src/uu/cp/src/cp.rs | 17 ++++++----------- tests/by-util/test_cp.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 7eaa21c11..7e64a288c 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -463,6 +463,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .get_matches_from(args); let options = crash_if_err!(EXIT_ERR, Options::from_matches(&matches)); + + if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::NoBackup { + show_usage_error!("options --backup and --no-clobber are mutually exclusive"); + return 1; + } + let paths: Vec = matches .values_of(OPT_PATHS) .map(|v| v.map(ToString::to_string).collect()) @@ -593,17 +599,6 @@ impl Options { let overwrite = OverwriteMode::from_matches(matches); - if overwrite == OverwriteMode::NoClobber && backup_mode != BackupMode::NoBackup { - show_error!( - "options --backup and --no-clobber are mutually exclusive\n\ - Try '{} --help' for more information.", - executable!() - ); - return Err(Error::Error( - "options --backup and --no-clobber are mutually exclusive".to_owned(), - )); - } - // Parse target directory options let no_target_dir = matches.is_present(OPT_NO_TARGET_DIRECTORY); let target_dir = matches diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index dddba595c..d41d3f6ed 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -539,6 +539,18 @@ fn test_cp_backup_off() { assert!(!at.file_exists(&format!("{}~", TEST_HOW_ARE_YOU_SOURCE))); } +#[test] +fn test_cp_backup_no_clobber_conflicting_options() { + let (_, mut ucmd) = at_and_ucmd!(); + + ucmd.arg("--backup") + .arg("--no-clobber") + .arg(TEST_HELLO_WORLD_SOURCE) + .arg(TEST_HOW_ARE_YOU_SOURCE) + .fails() + .stderr_is("cp: options --backup and --no-clobber are mutually exclusive\nTry 'cp --help' for more information."); +} + #[test] fn test_cp_deref_conflicting_options() { new_ucmd!()