Blob Blame History Raw
From 0435ebca64fbafcd62008c991dd9377d8a792dfc Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sat, 22 Aug 2020 14:06:26 -0700
Subject: [PATCH] Revert -L exit status change introduced in grep 3.2

Problems reported by Antonio Diaz Diaz in:
https://bugs.gnu.org/28105#29
* NEWS, doc/grep.texi (Exit Status), src/grep.c (usage):
Adjust documentation accordingly.
* src/grep.c (grepdesc, main): Go back to old behavior.
* tests/skip-read: Adjust tests accordingly.
---
 doc/grep.texi   |  3 ---
 src/grep.c      | 10 +++++-----
 tests/skip-read |  4 ++--
 4 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/doc/grep.texi b/doc/grep.texi
index 4b26f9d..02b1968 100644
--- a/doc/grep.texi
+++ b/doc/grep.texi
@@ -1112,9 +1112,6 @@ and only when @env{POSIXLY_CORRECT} is not set.
 
 Normally the exit status is 0 if a line is selected, 1 if no lines
 were selected, and 2 if an error occurred.  However, if the
-@option{-L} or @option{--files-without-match} is used, the exit status
-is 0 if a file is listed, 1 if no files were listed, and 2 if an error
-occurred.  Also, if the
 @option{-q} or @option{--quiet} or @option{--silent} option is used
 and a line is selected, the exit status is 0 even if an error
 occurred.  Other @command{grep} implementations may exit with status
diff --git a/src/grep.c b/src/grep.c
index 7ba602d..5764b2a 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -1864,11 +1864,11 @@ grepdesc (int desc, bool command_line)
         fflush_errno ();
     }
 
-  status = !count == !(list_files == LISTFILES_NONMATCHING);
+  status = !count;
 
-  if (list_files == LISTFILES_NONE || dev_null_output)
+  if (list_files == LISTFILES_NONE)
     finalize_input (desc, &st, ineof);
-  else if (status == 0)
+  else if (list_files == (status ? LISTFILES_NONMATCHING : LISTFILES_MATCHING))
     {
       print_filename ();
       putchar_errno ('\n' & filename_mask);
@@ -1997,7 +1997,7 @@ Context control:\n\
       printf (_("\
 When FILE is '-', read standard input.  With no FILE, read '.' if\n\
 recursive, '-' otherwise.  With fewer than two FILEs, assume -h.\n\
-Exit status is 0 if any line (or file if -L) is selected, 1 otherwise;\n\
+Exit status is 0 if any line is selected, 1 otherwise;\n\
 if any error occurs and -q is not given, the exit status is 2.\n"));
       emit_bug_reporting_address ();
     }
@@ -2835,7 +2835,7 @@ main (int argc, char **argv)
 
   /* POSIX says -c, -l and -q are mutually exclusive.  In this
      implementation, -q overrides -l and -L, which in turn override -c.  */
-  if (exit_on_match)
+  if (exit_on_match | dev_null_output)
     list_files = LISTFILES_NONE;
   if ((exit_on_match | dev_null_output) || list_files != LISTFILES_NONE)
     {
diff --git a/tests/skip-read b/tests/skip-read
index 2a17334..1e9e718 100755
--- a/tests/skip-read
+++ b/tests/skip-read
@@ -15,9 +15,9 @@ for opts in '-m0 y' '-f /dev/null' '-v ""'; do
       eval returns_ 1 grep -l $opts $matcher /dev/null > out || fail=1
       compare /dev/null out || fail=1
     done
-    eval grep -L $opts $matcher /dev/null > out || fail=1
+    eval returns_ 1 grep -L $opts $matcher /dev/null > out || fail=1
     compare exp out || fail=1
-    eval grep -L $opts $matcher /dev/null > /dev/null || fail=1
+    eval returns_ 1 grep -L $opts $matcher /dev/null > /dev/null || fail=1
   done
 done
 
-- 
2.28.0