git: 1070477cc8b7 - main - Fix remaining zgrep(1) wrapper script regressions

From: Craig Leres <leres_at_FreeBSD.org>
Date: Sun, 09 Feb 2025 18:45:06 UTC
The branch main has been updated by leres:

URL: https://cgit.FreeBSD.org/src/commit/?id=1070477cc8b7a88b1fd2b1ba810a1fff761799a1

commit 1070477cc8b7a88b1fd2b1ba810a1fff761799a1
Author:     Craig Leres <leres@FreeBSD.org>
AuthorDate: 2025-02-08 21:19:54 +0000
Commit:     Craig Leres <leres@FreeBSD.org>
CommitDate: 2025-02-09 18:45:03 +0000

    Fix remaining zgrep(1) wrapper script regressions
    
    Summary:
    Fix short flags without whitespace, e.g:
    
        zgrep -wefoo test
    
    Fix multiple -e flags:
    
        zgrep -e foo -e xxx test
    
    Previously only the last pattern would be used.
    
    Clean up possible leading blank in ${grep_args}.
    
    Update comment: 2.51 -> 2.6.0
    
    Add a test case for the last known zgrep wrapper issue: recursion
    (-r) not implemented.
    
    Reviewers: markj, kevans, ngie, bapt
    
    Reviewed By: markj
    
    Subscribers: imp
    
    Differential Revision: https://reviews.freebsd.org/D48873
---
 contrib/netbsd-tests/usr.bin/grep/t_grep.sh | 24 ++++++++++---
 usr.bin/grep/zgrep.sh                       | 52 +++++++++++++++++++++++++----
 2 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/contrib/netbsd-tests/usr.bin/grep/t_grep.sh b/contrib/netbsd-tests/usr.bin/grep/t_grep.sh
index b1412a7a0715..c4ba9a9657db 100755
--- a/contrib/netbsd-tests/usr.bin/grep/t_grep.sh
+++ b/contrib/netbsd-tests/usr.bin/grep/t_grep.sh
@@ -221,8 +221,6 @@ zgrep_combined_flags_head()
 }
 zgrep_combined_flags_body()
 {
-	atf_expect_fail "known but unsolved zgrep wrapper script regression"
-
 	echo 'foo bar' > test
 
 	atf_check -o inline:"foo bar\n" zgrep -we foo test
@@ -278,8 +276,6 @@ zgrep_multiple_eflags_head()
 }
 zgrep_multiple_eflags_body()
 {
-	atf_expect_fail "known but unsolved zgrep wrapper script regression"
-
 	echo foobar > test
 
 	atf_check -o inline:"foobar\n" zgrep -e foo -e xxx test
@@ -940,6 +936,25 @@ zgrep_multiple_files_body()
 	echo bar > test2
 	atf_check -s exit:1 zgrep foo test1 test2
 }
+
+atf_test_case zgrep_recursive
+zgrep_multiple_files_head()
+{
+	atf_set "descr" "Checks for zgrep wrapper recursion"
+}
+zgrep_recursive_body()
+{
+	atf_expect_fail "unimplemented zgrep wrapper script functionality"
+
+	mkdir -p tester1
+	echo foobar > tester1/test
+	atf_check -o inline:"tester1/test:foobar\n" zgrep -r foo tester1
+
+	mkdir -p tester2
+	echo foobar > tester2/test1
+	echo foobar > tester2/test2
+	atf_check -o inline:"tester2/test1:foobar\ntester2/test2:foobar\n" zgrep -r foo tester2
+}
 # End FreeBSD
 
 atf_init_test_cases()
@@ -996,5 +1011,6 @@ atf_init_test_cases()
 	atf_add_test_case mflag
 	atf_add_test_case mflag_trail_ctx
 	atf_add_test_case zgrep_multiple_files
+	atf_add_test_case zgrep_recursive
 # End FreeBSD
 }
diff --git a/usr.bin/grep/zgrep.sh b/usr.bin/grep/zgrep.sh
index d7a52dcad141..8bd630726647 100755
--- a/usr.bin/grep/zgrep.sh
+++ b/usr.bin/grep/zgrep.sh
@@ -74,7 +74,7 @@ esac
 while [ $# -gt 0 -a ${endofopts} -eq 0 ]
 do
     case $1 in
-    # from GNU grep-2.5.1 -- keep in sync!
+    # from GNU grep-2.6.0 -- keep in sync!
 	--)
 	    shift
 	    endofopts=1
@@ -85,6 +85,9 @@ do
 	    shift
 	    ;;
 	--regexp=*)
+	    if [ ${pattern_found} -ne 0 ]; then
+		grep_args="${grep_args} -e ${pattern}"
+	    fi
 	    pattern="${1#--regexp=}"
 	    pattern_found=1
 	    shift
@@ -100,20 +103,31 @@ do
 	    grep_args="${grep_args} $1"
 	    shift
 	    ;;
-	-*[ABCDXdefm])
+	-[EFGHILOSUVabchilnopqsuvwxyz]*)
+	    post="${1#-?}"
+	    pre=${1%${post}}
+	    grep_args="${grep_args} ${pre}"
+	    shift
+	    # Put back partial arg
+	    set -- "-${post}" $*
+	    ;;
+	-[ABCDdefm])
 	    if [ $# -lt 2 ]
 		then
 		echo "${prg}: missing argument for $1 flag" >&2
 		exit 1
 	    fi
 	    case $1 in
-		-*e)
+		-e)
+		    if [ ${pattern_found} -ne 0 ]; then
+			grep_args="${grep_args} -e ${pattern}"
+		    fi
 		    pattern="$2"
 		    pattern_found=1
 		    shift 2
 		    continue
 		    ;;
-		-*f)
+		-f)
 		    pattern_file=1
 		    ;;
 		*)
@@ -122,6 +136,27 @@ do
 	    grep_args="${grep_args} $1 $2"
 	    shift 2
 	    ;;
+	-[ABCDdefm]*)
+	    post="${1#-e}"
+	    case ${1} in
+		-e*)
+		    if [ ${pattern_found} -ne 0 ]; then
+			grep_args="${grep_args} -e ${pattern}"
+		    fi
+		    pattern="${post}"
+		    pattern_found=1
+		    shift
+		    continue
+		    ;;
+		-f*)
+		    pattern_file=1
+		    ;;
+		*)
+		    ;;
+	    esac
+	    grep_args="${grep_args} ${post}"
+	    shift
+	    ;;
 	-)
 	    hyphen=1
 	    shift
@@ -130,7 +165,7 @@ do
 	    echo "${prg}: the ${1} flag is not currently supported" >&2
 	    exit 1
 	    ;;
-	-*)
+	-?)
 	    grep_args="${grep_args} $1"
 	    shift
 	    ;;
@@ -156,12 +191,15 @@ then
     pattern_found=1
 fi
 
+# Clean up possible leading blank
+grep_args="${grep_args# }"
+
 # call grep ...
 if [ $# -lt 1 ]
 then
     # ... on stdin
     if [ ${pattern_file} -eq 0 ]; then
-	${cattool} ${catargs} - | ${grep} ${grep_args} -- "${pattern}" -
+	${cattool} ${catargs} - | ${grep} ${grep_args} -e "${pattern}" -- -
     else
 	${cattool} ${catargs} - | ${grep} ${grep_args} -- -
     fi
@@ -176,7 +214,7 @@ else
     for file; do
 	if [ ${pattern_file} -eq 0 ]; then
 	    ${cattool} ${catargs} -- "${file}" |
-		${grep} --label="${file}" ${grep_args} -- "${pattern}" -
+		${grep} --label="${file}" ${grep_args} -e "${pattern}" -- -
 	else
 	    ${cattool} ${catargs} -- "${file}" |
 		${grep} --label="${file}" ${grep_args} -- -