diff --git a/src/uucore/src/lib/features/checksum.rs b/src/uucore/src/lib/features/checksum.rs index 1bf83f607..c62e268c8 100644 --- a/src/uucore/src/lib/features/checksum.rs +++ b/src/uucore/src/lib/features/checksum.rs @@ -473,16 +473,26 @@ where // Use stdin if "-" is specified Box::new(stdin()) } else { - get_input_file(filename_input)? + match get_input_file(filename_input) { + Ok(f) => f, + Err(e) => { + // Could not read the file, show the error and continue to the next file + show_error!("{e}"); + set_exit_code(1); + continue; + } + } }; let reader = BufReader::new(file); let lines: Vec = reader.lines().collect::>()?; let Some((chosen_regex, is_algo_based_format)) = determine_regex(&lines) else { - return Err(ChecksumError::NoProperlyFormattedChecksumLinesFound { + let e = ChecksumError::NoProperlyFormattedChecksumLinesFound { filename: get_filename_for_output(filename_input, input_is_stdin), - } - .into()); + }; + show_error!("{e}"); + set_exit_code(1); + continue; }; for (i, line) in lines.iter().enumerate() { @@ -624,6 +634,7 @@ where // if any incorrectly formatted line, show it cksum_output(&res, ignore_missing, status); } + Ok(()) } diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index d1a0d224e..b2aafc2cb 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -2,7 +2,7 @@ // // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -// spell-checker:ignore (words) asdf algo algos +// spell-checker:ignore (words) asdf algo algos mgmt use crate::common::util::TestScenario; @@ -1221,3 +1221,32 @@ fn test_check_base64_hashes() { .succeeds() .stdout_is("empty: OK\nempty: OK\nempty: OK\n"); } + +#[test] +fn test_several_files_error_mgmt() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + // don't exist + scene + .ucmd() + .arg("--check") + .arg("empty") + .arg("incorrect") + .fails() + .stderr_contains("empty: No such file ") + .stderr_contains("incorrect: No such file "); + + at.touch("empty"); + at.touch("incorrect"); + + // exists but incorrect + scene + .ucmd() + .arg("--check") + .arg("empty") + .arg("incorrect") + .fails() + .stderr_contains("empty: no properly ") + .stderr_contains("incorrect: no properly "); +}