From cd1b5c5748ab2613faa5c63c59ed415a9739c27d Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Mon, 31 Jan 2022 22:08:59 -0700 Subject: [PATCH 1/5] [truncate] change cli error return code Exit with status code 1 for argument parsing errors in `truncate`. When `clap` encounters an error during argument parsing, it exits with status code 2. This causes some GNU tests to fail since they expect status code 1. --- src/uu/truncate/src/truncate.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 685363f8f..142524aad 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -6,6 +6,7 @@ // * file that was distributed with this source code. // spell-checker:ignore (ToDO) RFILE refsize rfilename fsize tsize +use clap; use clap::{crate_version, App, AppSettings, Arg}; use std::convert::TryFrom; use std::fs::{metadata, OpenOptions}; @@ -115,7 +116,16 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app() .override_usage(&usage[..]) .after_help(&long_usage[..]) - .get_matches_from(args); + .try_get_matches_from(args) + .unwrap_or_else(|e| { + e.print(); + match e.kind { + clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => { + std::process::exit(0) + } + _ => std::process::exit(1), + } + }); let files: Vec = matches .values_of(options::ARG_FILES) From 6f24166c63a3aa001f9c06df8a93fc2f0ab211b7 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Mon, 31 Jan 2022 22:25:59 -0700 Subject: [PATCH 2/5] [truncate] handle unused_must_use warning --- src/uu/truncate/src/truncate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 142524aad..4850e592a 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -118,7 +118,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .after_help(&long_usage[..]) .try_get_matches_from(args) .unwrap_or_else(|e| { - e.print(); + e.print().expect("Error writing clap::Error"); match e.kind { clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => { std::process::exit(0) From e1f7c774d811c4c3da6cd548bdc25c47a3183580 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Mon, 31 Jan 2022 22:59:10 -0700 Subject: [PATCH 3/5] Remove redundant import --- src/uu/truncate/src/truncate.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 4850e592a..12f413247 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -6,7 +6,6 @@ // * file that was distributed with this source code. // spell-checker:ignore (ToDO) RFILE refsize rfilename fsize tsize -use clap; use clap::{crate_version, App, AppSettings, Arg}; use std::convert::TryFrom; use std::fs::{metadata, OpenOptions}; From ea5541db5692022df684084bf6b4be2c58da6352 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Tue, 1 Feb 2022 08:29:22 -0700 Subject: [PATCH 4/5] truncate: add test_invalid_option --- tests/by-util/test_truncate.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index 0ef65ec16..c1e44f605 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -250,11 +250,24 @@ fn test_size_and_reference() { #[test] fn test_error_filename_only() { // truncate: you must specify either '--size' or '--reference' - new_ucmd!().args(&["file"]).fails().stderr_contains( - "error: The following required arguments were not provided: + new_ucmd!() + .args(&["file"]) + .fails() + .code_is(1) + .stderr_contains( + "error: The following required arguments were not provided: --reference --size ", - ); + ); +} + +#[test] +fn test_invalid_option() { + // truncate: cli parsing error returns 1 + new_ucmd!() + .args(&["--this-arg-does-not-exist"]) + .fails() + .code_is(1); } #[test] From 39f8329222acf64ff9d5a3193cd8608b46c1f4f4 Mon Sep 17 00:00:00 2001 From: Sam Caldwell Date: Tue, 1 Feb 2022 14:13:52 -0700 Subject: [PATCH 5/5] truncate: use `map_err` instead of `unwrap_or_else` --- src/uu/truncate/src/truncate.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 12f413247..242dd416a 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -116,15 +116,13 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .override_usage(&usage[..]) .after_help(&long_usage[..]) .try_get_matches_from(args) - .unwrap_or_else(|e| { + .map_err(|e| { e.print().expect("Error writing clap::Error"); match e.kind { - clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => { - std::process::exit(0) - } - _ => std::process::exit(1), + clap::ErrorKind::DisplayHelp | clap::ErrorKind::DisplayVersion => 0, + _ => 1, } - }); + })?; let files: Vec = matches .values_of(options::ARG_FILES)