Merge pull request #6801 from Luv-Ray/cksum_error_handling

cksum: fix error handling
This commit is contained in:
Daniel Hofstetter 2024-10-22 16:35:36 +02:00 committed by GitHub
commit c4160f2dd7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 54 additions and 12 deletions

View file

@ -154,7 +154,7 @@ pub fn create_sha3(bits: Option<usize>) -> UResult<HashAlgorithm> {
}
#[allow(clippy::comparison_chain)]
fn cksum_output(res: &ChecksumResult, ignore_missing: bool, status: bool) {
fn cksum_output(res: &ChecksumResult, status: bool) {
if res.bad_format == 1 {
show_warning_caps!("{} line is improperly formatted", res.bad_format);
} else if res.bad_format > 1 {
@ -168,12 +168,10 @@ fn cksum_output(res: &ChecksumResult, ignore_missing: bool, status: bool) {
show_warning_caps!("{} computed checksums did NOT match", res.failed_cksum);
}
}
if !ignore_missing {
if res.failed_open_file == 1 {
show_warning_caps!("{} listed file could not be read", res.failed_open_file);
} else if res.failed_open_file > 1 {
show_warning_caps!("{} listed files could not be read", res.failed_open_file);
}
if res.failed_open_file == 1 {
show_warning_caps!("{} listed file could not be read", res.failed_open_file);
} else if res.failed_open_file > 1 {
show_warning_caps!("{} listed files could not be read", res.failed_open_file);
}
}
@ -364,10 +362,16 @@ fn get_file_to_check(
if filename == "-" {
Some(Box::new(stdin())) // Use stdin if "-" is specified in the checksum file
} else {
let mut failed_open = || {
println!("{filename}: FAILED open or read");
res.failed_open_file += 1;
};
match File::open(filename) {
Ok(f) => {
if f.metadata().ok()?.is_dir() {
show!(USimpleError::new(1, format!("{filename}: Is a directory")));
// also regarded as a failed open
failed_open();
None
} else {
Some(Box::new(f))
@ -377,9 +381,8 @@ fn get_file_to_check(
if !ignore_missing {
// yes, we have both stderr and stdout here
show!(err.map_err_context(|| filename.to_string()));
println!("{filename}: FAILED open or read");
failed_open();
}
res.failed_open_file += 1;
// we could not open the file but we want to continue
None
}
@ -612,6 +615,9 @@ where
return Ok(());
}
// if any incorrectly formatted line, show it
cksum_output(&res, status);
if ignore_missing && correct_format == 0 {
// we have only bad format
// and we had ignore-missing
@ -633,9 +639,6 @@ where
if (res.failed_cksum > 0 || res.failed_open_file > 0) && !ignore_missing {
set_exit_code(1);
}
// if any incorrectly formatted line, show it
cksum_output(&res, ignore_missing, status);
}
Ok(())

View file

@ -1344,3 +1344,42 @@ fn test_check_comment_leading_space() {
.stdout_contains("foo: OK")
.stderr_contains("WARNING: 1 line is improperly formatted");
}
/// This test checks alignment with GNU's error handling.
/// Windows has a different logic and is guarded by [`test_check_directory_error`].
#[cfg(not(windows))]
#[test]
fn test_check_failed_to_read() {
// check `cksum`'s behavior when encountering directories or non existing files
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write(
"CHECKSUM",
"SHA1 (dir) = ffffffffffffffffffffffffffffffffffffffff\n\
SHA1 (not-file) = ffffffffffffffffffffffffffffffffffffffff\n",
);
at.mkdir("dir");
scene
.ucmd()
.arg("--check")
.arg("CHECKSUM")
.fails()
.stdout_is(
"dir: FAILED open or read\n\
not-file: FAILED open or read\n",
)
.stderr_contains("cksum: WARNING: 2 listed files could not be read");
// check with `--ignore-missing`
scene
.ucmd()
.arg("--check")
.arg("CHECKSUM")
.arg("--ignore-missing")
.fails()
.stdout_is("dir: FAILED open or read\n")
.stderr_contains("cksum: WARNING: 1 listed file could not be read");
}