diff options
author | kevans <kevans@FreeBSD.org> | 2017-08-16 01:45:53 +0000 |
---|---|---|
committer | kevans <kevans@FreeBSD.org> | 2017-08-16 01:45:53 +0000 |
commit | 7243c688be10e693779af2c604b50d659fa6cbc3 (patch) | |
tree | 152c90f31668a9af61fdbfdc5cd87a1b3aa1103e /usr.bin | |
parent | ff57ef606cfea373c507b9dffd7cc60e6e3eae43 (diff) | |
download | FreeBSD-src-7243c688be10e693779af2c604b50d659fa6cbc3.zip FreeBSD-src-7243c688be10e693779af2c604b50d659fa6cbc3.tar.gz |
bsdgrep: Use implied working directory for -r if no directories are passed
MFC r317050: bsdgrep: for -r, use the working directory if none specified
This is more sensible than the previous behaviour of grepping stdin,
and matches newer GNU grep behaviour.
MFC r317300 (ngie): Only expect :grep_r_implied to pass with bsdgrep(1)
The test fails with gnu grep from base and ports.
MFC r319002 (ngie): :rgrep : use atf-check to check the exit code/save the
output of grep -r instead of calling grep -r without it, and saving the
output to a file
This ensures that any errors thrown via grep -r are caught, not lost, and
uses existing atf-sh idioms for saving files.
PR: 216307
Approved by: emaste (mentor, blanket MFC)
Relnotes: yes
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/grep/grep.c | 2 | ||||
-rw-r--r-- | usr.bin/grep/tests/Makefile | 1 | ||||
-rwxr-xr-x | usr.bin/grep/tests/grep_freebsd_test.sh | 88 | ||||
-rw-r--r-- | usr.bin/grep/util.c | 5 |
4 files changed, 94 insertions, 2 deletions
diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c index 190322c..47e6465 100644 --- a/usr.bin/grep/grep.c +++ b/usr.bin/grep/grep.c @@ -739,7 +739,7 @@ main(int argc, char *argv[]) if ((aargc == 0 || aargc == 1) && !Hflag) hflag = true; - if (aargc == 0) + if (aargc == 0 && dirbehave != DIR_RECURSE) exit(!procfile("-")); if (dirbehave == DIR_RECURSE) diff --git a/usr.bin/grep/tests/Makefile b/usr.bin/grep/tests/Makefile index 51c2deb..f383aa2 100644 --- a/usr.bin/grep/tests/Makefile +++ b/usr.bin/grep/tests/Makefile @@ -2,6 +2,7 @@ PACKAGE= tests +ATF_TESTS_SH+= grep_freebsd_test NETBSD_ATF_TESTS_SH= grep_test ${PACKAGE}FILES+= d_basic.out diff --git a/usr.bin/grep/tests/grep_freebsd_test.sh b/usr.bin/grep/tests/grep_freebsd_test.sh new file mode 100755 index 0000000..ab998ec --- /dev/null +++ b/usr.bin/grep/tests/grep_freebsd_test.sh @@ -0,0 +1,88 @@ +# +# Copyright (c) 2017 Kyle Evans <kevans91@ksu.edu> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# $FreeBSD$ + +# What grep(1) are we working with? +# - 0 : bsdgrep +# - 1 : gnu grep 2.51 (base) +# - 2 : gnu grep (ports) +GREP_TYPE_BSD=0 +GREP_TYPE_GNU_FREEBSD=1 +GREP_TYPE_GNU=2 +GREP_TYPE_UNKNOWN=3 + +grep_type() +{ + local grep_version=$(grep --version) + + case "$grep_version" in + *"BSD grep"*) + return $GREP_TYPE_BSD + ;; + *"GNU grep"*) + case "$grep_version" in + *2.5.1-FreeBSD*) + return $GREP_TYPE_GNU_FREEBSD + ;; + *) + return $GREP_TYPE_GNU + ;; + esac + ;; + esac + atf_fail "unknown grep type: $grep_version" +} + +atf_test_case grep_r_implied +grep_r_implied_body() +{ + grep_type + if [ $? -ne $GREP_TYPE_BSD ]; then + atf_skip "this test only works with bsdgrep(1)" + fi + + (cd "$(atf_get_srcdir)" && grep -r --exclude="*.out" -e "test" .) > d_grep_r_implied.out + + atf_check -s exit:0 -x \ + "(cd $(atf_get_srcdir) && grep -r --exclude=\"*.out\" -e \"test\") | diff d_grep_r_implied.out -" +} + +atf_test_case rgrep +rgrep_head() +{ + atf_set "require.progs" "rgrep" +} +rgrep_body() +{ + atf_check -o save:d_grep_r_implied.out grep -r --exclude="*.out" -e "test" "$(atf_get_srcdir)" + atf_check -o file:d_grep_r_implied.out rgrep --exclude="*.out" -e "test" "$(atf_get_srcdir)" +} + +atf_init_test_cases() +{ + atf_add_test_case grep_r_implied + atf_add_test_case rgrep +} diff --git a/usr.bin/grep/util.c b/usr.bin/grep/util.c index 437a264..37b48c4 100644 --- a/usr.bin/grep/util.c +++ b/usr.bin/grep/util.c @@ -109,6 +109,7 @@ grep_tree(char **argv) FTSENT *p; int c, fts_flags; bool ok; + const char *wd[] = { ".", NULL }; c = fts_flags = 0; @@ -126,7 +127,9 @@ grep_tree(char **argv) fts_flags |= FTS_NOSTAT | FTS_NOCHDIR; - if (!(fts = fts_open(argv, fts_flags, NULL))) + fts = fts_open((argv[0] == NULL) ? + __DECONST(char * const *, wd) : argv, fts_flags, NULL); + if (fts == NULL) err(2, "fts_open"); while ((p = fts_read(fts)) != NULL) { switch (p->fts_info) { |