Skip to content

Commit

Permalink
Merge pull request #4064 from dmatos2012/hashsum-process-files-before…
Browse files Browse the repository at this point in the history
…-exit

hashsum: warn on file not found rather than fail
  • Loading branch information
sylvestre authored Oct 22, 2022
2 parents 7c1d826 + 49c435a commit 5f9e66a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 7 deletions.
31 changes: 25 additions & 6 deletions src/uu/hashsum/src/hashsum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,8 @@ where
I: Iterator<Item = &'a OsStr>,
{
let mut bad_format = 0;
let mut failed = 0;
let mut failed_cksum = 0;
let mut failed_open_file = 0;
let binary_marker = if options.binary { "*" } else { " " };
for filename in files {
let filename = Path::new(filename);
Expand Down Expand Up @@ -574,8 +575,19 @@ where
}
},
};
let f = File::open(ck_filename)
.map_err_context(|| "failed to open file".to_string())?;
let f = match File::open(ck_filename) {
Err(_) => {
failed_open_file += 1;
println!(
"{}: {}: No such file or directory",
uucore::util_name(),
ck_filename
);
println!("{}: FAILED open or read", ck_filename);
continue;
}
Ok(file) => file,
};
let mut ckf = BufReader::new(Box::new(f) as Box<dyn Read>);
let real_sum = digest_reader(
&mut options.digest,
Expand All @@ -602,7 +614,7 @@ where
if !options.status {
println!("{}: FAILED", ck_filename);
}
failed += 1;
failed_cksum += 1;
}
}
} else {
Expand All @@ -628,8 +640,15 @@ where
Ordering::Greater => show_warning!("{} lines are improperly formatted", bad_format),
_ => {}
};
if failed > 0 {
show_warning!("{} computed checksum did NOT match", failed);
if failed_cksum > 0 {
show_warning!("{} computed checksum did NOT match", failed_cksum);
}
match failed_open_file.cmp(&1) {
Ordering::Equal => show_warning!("{} listed file could not be read", failed_open_file),
Ordering::Greater => {
show_warning!("{} listed files could not be read", failed_open_file);
}
_ => {}
}
}

Expand Down
22 changes: 21 additions & 1 deletion tests/by-util/test_hashsum.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::common::util::*;
// spell-checker:ignore checkfile, nonames, testf
// spell-checker:ignore checkfile, nonames, testf, ntestf
macro_rules! get_hash(
($str:expr) => (
$str.split(' ').collect::<Vec<&str>>()[0]
Expand Down Expand Up @@ -117,6 +117,26 @@ fn test_check_sha1() {
.stderr_is("");
}

#[test]
fn test_check_file_not_found_warning() {
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;

at.write("testf", "foobar\n");
at.write(
"testf.sha1",
"988881adc9fc3655077dc2d4d757d480b5ea0e11 testf\n",
);
at.remove("testf");
scene
.ccmd("sha1sum")
.arg("-c")
.arg(at.subdir.join("testf.sha1"))
.succeeds()
.stdout_is("sha1sum: testf: No such file or directory\ntestf: FAILED open or read\n")
.stderr_is("sha1sum: warning: 1 listed file could not be read");
}

#[test]
fn test_invalid_arg() {
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
Expand Down

0 comments on commit 5f9e66a

Please sign in to comment.