summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/uucore/src/lib/features/checksum.rs19
-rw-r--r--tests/by-util/test_cksum.rs31
2 files changed, 45 insertions, 5 deletions
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<String> = reader.lines().collect::<Result<_, _>>()?;
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 ");
+}