On 23/11/15 16:41, Jim Meyering wrote:
> I think a common expected usage of --ignore-missing would be
> the case of an SHA1SUM file listing all possibly-verified files for
> which it is common to verify only the one or two downloaded files.
> In any invocation that ends up ignoring *all* file names, I would
> want a loud warning and failure, to be sure that my eyes (and/or
> any tool) notice something is wrong.
> 
> The absence of an "OK" is far easier to miss than a diagnostic.
> At least a few are often expected to be missing, so I see little
> value in emitting "MISSING" diagnostics.

Yes I agree. Thinking more, one could have a syntactically correct
checksum file which is adjusted to comment out certain entries, and
currently sha1sum etc. (with or without --ignore-missing)
will error out unless something is verified:

$ echo '#'|sha1sum --check --ignore-missing
sha1sum: standard input: no properly formatted SHA1 checksum lines found

So given that the existing functionality is to ensure something is verified,
then --ignore-missing should be consistent.

I'll push the attached a bit later.

thanks!
Pádraig
>From 65861779310825e36e8a0ce54f3c816167bc36ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email protected]>
Date: Mon, 23 Nov 2015 17:11:26 +0000
Subject: [PATCH] md5sum,sha*sum: ensure --ignore-missing fails when no files
 verified

* src/md5sum.c (digest_check): Update a matched_checksums bool upon
matched checksum and fail (loudly unless --status is specified)
if there were no matches.  Also change properly_formatted_lines
to a bool while at it since we don't need to track the number.
* tests/misc/md5sum.pl: Add a test case.
Suggested by Jim Meyering.
---
 src/md5sum.c         | 16 ++++++++++++----
 tests/misc/md5sum.pl |  6 ++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/md5sum.c b/src/md5sum.c
index 49da8ed..67b2fbc 100644
--- a/src/md5sum.c
+++ b/src/md5sum.c
@@ -523,10 +523,11 @@ digest_check (const char *checkfile_name)
 {
   FILE *checkfile_stream;
   uintmax_t n_misformatted_lines = 0;
-  uintmax_t n_properly_formatted_lines = 0;
   uintmax_t n_improperly_formatted_lines = 0;
   uintmax_t n_mismatched_checksums = 0;
   uintmax_t n_open_or_read_failures = 0;
+  bool properly_formatted_lines = false;
+  bool matched_checksums = false;
   unsigned char bin_buffer_unaligned[DIGEST_BIN_BYTES + DIGEST_ALIGN];
   /* Make sure bin_buffer is properly aligned. */
   unsigned char *bin_buffer = ptr_align (bin_buffer_unaligned, DIGEST_ALIGN);
@@ -606,7 +607,7 @@ digest_check (const char *checkfile_name)
              to ease automatic processing of status output.  */
           bool needs_escape = ! status_only && strchr (filename, '\n');
 
-          ++n_properly_formatted_lines;
+          properly_formatted_lines = true;
 
           *bin_buffer = '\1'; /* flag set to 0 for ignored missing files.  */
           ok = digest_file (filename, &binary, bin_buffer);
@@ -645,6 +646,8 @@ digest_check (const char *checkfile_name)
                 }
               if (cnt != digest_bin_bytes)
                 ++n_mismatched_checksums;
+              else
+                matched_checksums = true;
 
               if (!status_only)
                 {
@@ -679,7 +682,7 @@ digest_check (const char *checkfile_name)
       return false;
     }
 
-  if (n_properly_formatted_lines == 0)
+  if (! properly_formatted_lines)
     {
       /* Warn if no tests are found.  */
       error (0, 0, _("%s: no properly formatted %s checksum lines found"),
@@ -712,10 +715,15 @@ digest_check (const char *checkfile_name)
                      "WARNING: %" PRIuMAX " computed checksums did NOT match",
                      select_plural (n_mismatched_checksums))),
                    n_mismatched_checksums);
+
+          if (ignore_missing && ! matched_checksums)
+            error (0, 0, _("%s: no files were verified"),
+                   quotef (checkfile_name));
         }
     }
 
-  return (n_properly_formatted_lines != 0
+  return (properly_formatted_lines
+          && matched_checksums
           && n_mismatched_checksums == 0
           && n_open_or_read_failures == 0
           && (!strict || n_improperly_formatted_lines == 0));
diff --git a/tests/misc/md5sum.pl b/tests/misc/md5sum.pl
index 3a7744b..92c60f6 100755
--- a/tests/misc/md5sum.pl
+++ b/tests/misc/md5sum.pl
@@ -143,6 +143,12 @@ my @Tests =
                                    "meaningful only when verifying checksums\n".
                                    $try_help},
                                 {EXIT=> 1}],
+     ['check-ignore-missing-5', '--check', '--ignore-missing',
+                                {AUX=> {f=> ''}},
+                                {IN=> {'f.md5' => "$degenerate  missing\n"}},
+                                {ERR=>
+                                    "md5sum: f.md5: no files were verified\n"},
+                                {EXIT=> 1}],
      ['bsd-segv', '--check', {IN=> {'z' => "MD5 ("}}, {EXIT=> 1},
       {ERR=> "$prog: z: no properly formatted MD5 checksum lines found\n"}],
 
-- 
2.5.0

Reply via email to