From 7ffc16c31d51e0fd918f452b388d122a738afe98 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 16 Jun 2025 15:54:13 +0200 Subject: [PATCH 1/2] cp: let clap render help & version --- src/uu/cp/src/cp.rs | 63 ++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index d2966c5c4..3ce6e024d 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -23,7 +23,7 @@ use thiserror::Error; use platform::copy_on_write; use uucore::display::Quotable; -use uucore::error::{UClapError, UError, UResult, UUsageError, set_exit_code}; +use uucore::error::{UError, UResult, UUsageError, set_exit_code}; #[cfg(unix)] use uucore::fs::make_fifo; use uucore::fs::{ @@ -796,46 +796,33 @@ pub fn uu_app() -> Command { #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app().try_get_matches_from(args); + let mut matches = uu_app().try_get_matches_from(args)?; - // The error is parsed here because we do not want version or help being printed to stderr. - if let Err(e) = matches { - let mut app = uu_app(); + let options = Options::from_matches(&matches)?; - match e.kind() { - clap::error::ErrorKind::DisplayHelp => { - app.print_help()?; - } - clap::error::ErrorKind::DisplayVersion => print!("{}", app.render_version()), - _ => return Err(Box::new(e.with_exit_code(1))), + if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::None { + return Err(UUsageError::new( + EXIT_ERR, + "options --backup and --no-clobber are mutually exclusive", + )); + } + + let paths: Vec = matches + .remove_many::(options::PATHS) + .map(|v| v.map(PathBuf::from).collect()) + .unwrap_or_default(); + + let (sources, target) = parse_path_args(paths, &options)?; + + if let Err(error) = copy(&sources, &target, &options) { + match error { + // Error::NotAllFilesCopied is non-fatal, but the error + // code should still be EXIT_ERR as does GNU cp + CpError::NotAllFilesCopied => {} + // Else we caught a fatal bubbled-up error, log it to stderr + _ => show_error!("{error}"), }; - } else if let Ok(mut matches) = matches { - let options = Options::from_matches(&matches)?; - - if options.overwrite == OverwriteMode::NoClobber && options.backup != BackupMode::None { - return Err(UUsageError::new( - EXIT_ERR, - "options --backup and --no-clobber are mutually exclusive", - )); - } - - let paths: Vec = matches - .remove_many::(options::PATHS) - .map(|v| v.map(PathBuf::from).collect()) - .unwrap_or_default(); - - let (sources, target) = parse_path_args(paths, &options)?; - - if let Err(error) = copy(&sources, &target, &options) { - match error { - // Error::NotAllFilesCopied is non-fatal, but the error - // code should still be EXIT_ERR as does GNU cp - CpError::NotAllFilesCopied => {} - // Else we caught a fatal bubbled-up error, log it to stderr - _ => show_error!("{error}"), - }; - set_exit_code(EXIT_ERR); - } + set_exit_code(EXIT_ERR); } Ok(()) From a6e104fc981bda8b2a8acfb603cec46c23c658ad Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Mon, 16 Jun 2025 16:24:32 +0200 Subject: [PATCH 2/2] cp: use get_many instead of remove_many from clap --- src/uu/cp/src/cp.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 3ce6e024d..986531136 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -796,7 +796,7 @@ pub fn uu_app() -> Command { #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let mut matches = uu_app().try_get_matches_from(args)?; + let matches = uu_app().try_get_matches_from(args)?; let options = Options::from_matches(&matches)?; @@ -808,7 +808,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } let paths: Vec = matches - .remove_many::(options::PATHS) + .get_many::(options::PATHS) .map(|v| v.map(PathBuf::from).collect()) .unwrap_or_default();