summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorkevans <kevans@FreeBSD.org>2017-08-16 01:45:53 +0000
committerkevans <kevans@FreeBSD.org>2017-08-16 01:45:53 +0000
commit7243c688be10e693779af2c604b50d659fa6cbc3 (patch)
tree152c90f31668a9af61fdbfdc5cd87a1b3aa1103e /usr.bin
parentff57ef606cfea373c507b9dffd7cc60e6e3eae43 (diff)
downloadFreeBSD-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.c2
-rw-r--r--usr.bin/grep/tests/Makefile1
-rwxr-xr-xusr.bin/grep/tests/grep_freebsd_test.sh88
-rw-r--r--usr.bin/grep/util.c5
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) {
OpenPOWER on IntegriCloud