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