Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dab7554

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

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/uu/hashsum/src/hashsum.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use clap::value_parser;
1111
use clap::{Arg, ArgMatches, Command};
1212
use std::ffi::{OsStr, OsString};
1313
use std::fs::File;
14-
use std::io::{BufReader, Read, stdin};
14+
use std::io::{BufReader, Error, Read, stdin};
1515
use std::iter;
1616
use std::num::ParseIntError;
1717
use std::path::Path;
@@ -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;
2929
use uucore::format_usage;
3030
use uucore::sum::{Digest, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Shake128, Shake256};
3131
use uucore::translate;
@@ -533,6 +533,12 @@ fn uu_app(binary_name: &str) -> (Command, bool) {
533533
(command, is_hashsum_bin)
534534
}
535535

536+
fn print_os_error(binary_name: &str, filename: &str, os_error: &Error) {
537+
let err_string = os_error.to_string();
538+
let clean_err_string = err_string.split(" (os error").next().unwrap_or(&err_string);
539+
eprintln!("{binary_name}: {filename}: {clean_err_string}");
540+
}
541+
536542
#[allow(clippy::cognitive_complexity)]
537543
fn hashsum<'a, I>(mut options: Options, files: I) -> UResult<()>
538544
where
@@ -564,13 +570,20 @@ where
564570
},
565571
);
566572

567-
let (sum, _) = digest_reader(
573+
let sum = match digest_reader(
568574
&mut options.digest,
569575
&mut file,
570576
options.binary,
571577
options.output_bits,
572-
)
573-
.map_err_context(|| translate!("hashsum-error-failed-to-read-input"))?;
578+
) {
579+
Ok((sum, _)) => sum,
580+
Err(e) => {
581+
print_os_error(options.binary_name, &filename.to_string_lossy(), &e);
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)