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
This commit is contained in:
Craig Leres 2025-02-08 13:19:54 -08:00
parent 36f1db7a37
commit 1070477cc8
2 changed files with 65 additions and 11 deletions

View file

@ -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
}

View file

@ -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} -- -