diff options
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | src/main.c | 27 | ||||
-rwxr-xr-x | tests/include-exclude | 6 |
3 files changed, 31 insertions, 9 deletions
@@ -4,6 +4,13 @@ GNU grep NEWS -*- outline -*- ** Bug fixes + The --include, --exclude, and --exclude-dir options now handle + command-line arguments more consistently. --include and --exclude + apply only to non-directories and --exclude-dir applies only to + directories. "-" (standard input) is never excluded, since it is + not a file name. + [bug introduced in grep-2.5] + grep no longer rejects "grep -qr . > out", i.e., when run with -q and an input file is the same as the output file, since with -q grep generates no output, so there is no risk of infinite loop or @@ -2205,15 +2205,26 @@ main (int argc, char **argv) do { char *file = argv[optind]; - if ((included_patterns || excluded_patterns) - && !isdir (file)) + if (!STREQ (file, "-") + && (included_patterns || excluded_patterns + || excluded_directory_patterns)) { - if (included_patterns - && excluded_file_name (included_patterns, file)) - continue; - if (excluded_patterns - && excluded_file_name (excluded_patterns, file)) - continue; + if (isdir (file)) + { + if (excluded_directory_patterns + && excluded_file_name (excluded_directory_patterns, + file)) + continue; + } + else + { + if (included_patterns + && excluded_file_name (included_patterns, file)) + continue; + if (excluded_patterns + && excluded_file_name (excluded_patterns, file)) + continue; + } } status &= grepfile (STREQ (file, "-") ? (char *) NULL : file, &stats_base); diff --git a/tests/include-exclude b/tests/include-exclude index 4249c56a..12955c00 100755 --- a/tests/include-exclude +++ b/tests/include-exclude @@ -12,6 +12,7 @@ printf '%s\n' x/dir/d:ddd > exp-not-ab || framework_failure_ printf '%s\n' x/a:aaa x/b:bbb > exp-not-d || framework_failure_ printf '%s\n' x/a:aaa x/b:bbb > exp-not-dir || framework_failure_ printf '%s\n' x/a:aaa > exp-a || framework_failure_ +printf '%s\n' aaa > exp-aaa || framework_failure_ grep -r --exclude='a*' . x > out || fail=1 sort out > k && mv k out @@ -40,7 +41,10 @@ grep -r --include='a*' . x > out || fail=1 compare exp-a out || fail=1 # --include (without --recursive) uses different code -grep --include=a '^aaa$' x/* > out || fail=1 +grep --include=a --exclude-dir=dir '^aaa$' x/* > out || fail=1 compare exp-a out || fail=1 +grep --exclude=- '^aaa$' - < x/a > out || fail=1 +compare exp-aaa out || fail=1 + Exit $fail |