Skip to content

Commit 889d59c

Browse files
committed
hashsum: don't fail on os errors
1 parent 4c68e1e commit 889d59c

File tree

2 files changed

+45
-6
lines changed

2 files changed

+45
-6
lines changed

src/uu/hashsum/src/hashsum.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use uucore::checksum::detect_algo;
2525
use uucore::checksum::digest_reader;
2626
use uucore::checksum::escape_filename;
2727
use uucore::checksum::perform_checksum_validation;
28-
use uucore::error::{FromIo, UResult};
28+
use uucore::error::{UResult, strip_errno};
2929
use uucore::format_usage;
3030
use uucore::sum::{Digest, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Shake128, Shake256};
3131
use uucore::translate;
@@ -552,9 +552,10 @@ where
552552
Ok(f) => f,
553553
Err(e) => {
554554
eprintln!(
555-
"{}: {}: {e}",
555+
"{}: {}: {}",
556556
options.binary_name,
557-
filename.to_string_lossy()
557+
filename.to_string_lossy(),
558+
strip_errno(&e)
558559
);
559560
err_found = Some(ChecksumError::Io(e));
560561
continue;
@@ -564,13 +565,25 @@ where
564565
},
565566
);
566567

567-
let (sum, _) = digest_reader(
568+
let sum = match digest_reader(
568569
&mut options.digest,
569570
&mut file,
570571
options.binary,
571572
options.output_bits,
572-
)
573-
.map_err_context(|| translate!("hashsum-error-failed-to-read-input"))?;
573+
) {
574+
Ok((sum, _)) => sum,
575+
Err(e) => {
576+
eprintln!(
577+
"{}: {}: {}",
578+
options.binary_name,
579+
filename.to_string_lossy(),
580+
strip_errno(&e)
581+
);
582+
err_found = Some(ChecksumError::Io(e));
583+
continue;
584+
}
585+
};
586+
574587
let (escaped_filename, prefix) = escape_filename(filename);
575588
if options.tag {
576589
if options.algoname == "blake2b" {

tests/by-util/test_hashsum.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,32 @@ fn test_check_directory_error() {
872872
.stderr_contains(err_msg);
873873
}
874874

875+
#[test]
876+
fn test_continue_after_directory_error() {
877+
let scene = TestScenario::new(util_name!());
878+
let at = &scene.fixtures;
879+
880+
at.mkdir("d");
881+
at.touch("file");
882+
#[cfg(not(windows))]
883+
let (out, err_msg) = (
884+
"d41d8cd98f00b204e9800998ecf8427e file\n",
885+
"md5sum: d: Is a directory\n",
886+
);
887+
#[cfg(windows)]
888+
let (out, err_msg) = (
889+
"d41d8cd98f00b204e9800998ecf8427e *file\n",
890+
"md5sum: d: Access is denied.\n",
891+
);
892+
scene
893+
.ccmd("md5sum")
894+
.arg("d")
895+
.arg("file")
896+
.fails()
897+
.stdout_is(out)
898+
.stderr_is(err_msg);
899+
}
900+
875901
#[test]
876902
fn test_check_quiet() {
877903
let scene = TestScenario::new(util_name!());

0 commit comments

Comments
 (0)