md5sum: new option, --quiet, to suppress OK messages
authorErik Auerswald <auerswal@unix-ag.uni-kl.de>
Sun, 1 Jun 2008 10:40:40 +0000 (12:40 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 1 Jun 2008 14:55:11 +0000 (16:55 +0200)
sha1sum, sha224sum, sha384sum, and sha512sum accept it, too.
* src/md5sum.c: add option --quiet to suppress OK messages
* doc/coreutils.texi: document option --quiet
* tests/misc/md5sum: add test for option --quiet
* NEWS: mention new option --quiet for md5sum+sha*sum in "New
  features" section

NEWS
doc/coreutils.texi
src/md5sum.c
tests/misc/md5sum

diff --git a/NEWS b/NEWS
index 02be5c2..b12631b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release 7.0 (????-??-??) [beta]
 
+** New features
+
+  md5sum now accepts the new option, --quiet, to suppress the printing of
+  'OK' messages.  sha1sum, sha224sum, sha384sum, and sha512sum accept it, too.
+
 
 * Noteworthy changes in release 6.12 (2008-05-31) [stable]
 
index dbc8a8b..e804d58 100644 (file)
@@ -3277,6 +3277,15 @@ an MD5 checksum inconsistent with the associated file, or if no valid
 line is found, @command{md5sum} exits with nonzero status.  Otherwise,
 it exits successfully.
 
+@itemx --quiet
+@opindex --quiet
+@cindex verifying MD5 checksums
+This option is useful only when verifying checksums.
+When verifying checksums, don't generate an 'OK' message per successfully
+checked file.  Files that fail the verification are reported in the
+default one-line-per-file format.  If there is any checksum mismatch,
+print a warning summarizing the failures to standard error.
+
 @itemx --status
 @opindex --status
 @cindex verifying MD5 checksums
index df812b9..c0b5ed5 100644 (file)
@@ -117,6 +117,9 @@ static bool status_only = false;
    improperly formatted checksum line.  */
 static bool warn = false;
 
+/* With --check, suppress the "OK" printed for each verified file.  */
+static bool quiet = false;
+
 /* The name this program was run with.  */
 char *program_name;
 
@@ -124,13 +127,15 @@ char *program_name;
    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
 enum
 {
-  STATUS_OPTION = CHAR_MAX + 1
+  STATUS_OPTION = CHAR_MAX + 1,
+  QUIET_OPTION
 };
 
 static const struct option long_options[] =
 {
   { "binary", no_argument, NULL, 'b' },
   { "check", no_argument, NULL, 'c' },
+  { "quiet", no_argument, NULL, QUIET_OPTION },
   { "status", no_argument, NULL, STATUS_OPTION },
   { "text", no_argument, NULL, 't' },
   { "warn", no_argument, NULL, 'w' },
@@ -177,7 +182,8 @@ With no FILE, or when FILE is -, read standard input.\n\
 "), stdout);
       fputs (_("\
 \n\
-The following two options are useful only when verifying checksums:\n\
+The following three options are useful only when verifying checksums:\n\
+      --quiet             don't print OK for each successfully verified file\n\
       --status            don't output anything, status code shows success\n\
   -w, --warn              warn about improperly formatted checksum lines\n\
 \n\
@@ -530,8 +536,10 @@ digest_check (const char *checkfile_name)
 
              if (!status_only)
                {
-                 printf ("%s: %s\n", filename,
-                         (cnt != digest_bin_bytes ? _("FAILED") : _("OK")));
+                 if (cnt != digest_bin_bytes)
+                   printf ("%s: %s\n", filename, _("FAILED"));
+                 else if (!quiet)
+                   printf ("%s: %s\n", filename, _("OK"));
                  fflush (stdout);
                }
            }
@@ -624,6 +632,7 @@ main (int argc, char **argv)
       case STATUS_OPTION:
        status_only = true;
        warn = false;
+       quiet = false;
        break;
       case 't':
        binary = 0;
@@ -631,6 +640,12 @@ main (int argc, char **argv)
       case 'w':
        status_only = false;
        warn = true;
+       quiet = false;
+       break;
+      case QUIET_OPTION:
+       status_only = false;
+       warn = false;
+       quiet = true;
        break;
       case_GETOPT_HELP_CHAR;
       case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
@@ -662,6 +677,13 @@ main (int argc, char **argv)
       usage (EXIT_FAILURE);
     }
 
+  if (quiet & !do_check)
+    {
+      error (0, 0,
+       _("the --quiet option is meaningful only when verifying checksums"));
+      usage (EXIT_FAILURE);
+    }
+
   if (!O_BINARY && binary < 0)
     binary = 0;
 
index c99d6bb..bc1ac08 100755 (executable)
@@ -45,6 +45,15 @@ my @Tests =
                                {OUT=>"f: OK\n"}],
      ['check-2', '--check', '--status', {IN=>{'f.md5' => "$degenerate  f\n"}},
                                {AUX=> {f=> 'foo'}}, {EXIT=> 1}],
+     ['check-quiet1', '--check', '--quiet', {AUX=> {f=> ''}},
+                               {IN=> {'f.md5' => "$degenerate  f\n"}},
+                               {OUT=>""}],
+     ['check-quiet2', '--check', '--quiet',
+                               {IN=>{'f.md5' => "$degenerate  f\n"}},
+                               {AUX=> {f=> 'foo'}}, {OUT=>"f: FAILED\n"},
+                               {ERR=>"md5sum: WARNING: 1 of 1 computed"
+                                      . " checksum did NOT match\n"},
+                               {EXIT=> 1}],
      # The sha1sum and md5sum drivers share a lot of code.
      # Ensure that md5sum does *not* share the part that makes
      # sha1sum accept BSD format.