Subject: Re: Mini bug with option --exclude-dir

From: Paul Eggert <[email-masked]>
Date: Sat, 24 May 2014 14:11:22 -0700

I pushed the attached patch to fix this.  Thanks again for reporting the 
problem.
From aa17882425c882ce8142f5f15880aa238c1fa855 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Sat, 24 May 2014 14:06:29 -0700
Subject: [PATCH] grep: --exclude-dir=FOO/ now ignores the trailing slash

Problem reported by Khaled Ziyaeen; see: http://bugs.gnu.org/17481
* NEWS, doc/grep.texi (File and Directory Selection): Document this.
* src/grep.c (main): Implement this.
* tests/include-exclude: Test this.
---
 NEWS                  | 5 +++++
 doc/grep.texi         | 4 ++--
 src/grep.c            | 1 +
 tests/include-exclude | 4 ++++
 4 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/NEWS b/NEWS
index bf31940..10b2d19 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU grep NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Changes in behavior
+
+  grep --exclude-dir='FOO/' now excludes the directory FOO.
+  Previously, the trailing slash meant the option was ineffective.
+
 
 * Noteworthy changes in release 2.19 (2014-05-22) [stable]
 
diff --git a/doc/grep.texi b/doc/grep.texi
index feee0d8..c9417e5 100644
--- a/doc/grep.texi
+++ b/doc/grep.texi
@@ -668,8 +668,8 @@ under @option{--exclude}).
 @item --exclude-dir=@var{dir}
 @opindex --exclude-dir
 @cindex exclude directories
-Exclude directories matching the pattern @var{dir} from recursive
-directory searches.
+Skip any directory whose name matches the pattern @var{dir}, ignoring
+any redundant trailing slashes in @var{dir}.
 
 @item -I
 Process a binary file as if it did not contain matching data;
diff --git a/src/grep.c b/src/grep.c
index ec955d8..6a2a029 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -2234,6 +2234,7 @@ main (int argc, char **argv)
       case EXCLUDE_DIRECTORY_OPTION:
         if (!excluded_directory_patterns)
           excluded_directory_patterns = new_exclude ();
+        strip_trailing_slashes (optarg);
         add_exclude (excluded_directory_patterns, optarg, EXCLUDE_WILDCARDS);
         break;
 
diff --git a/tests/include-exclude b/tests/include-exclude
index 28465cb..9c07139 100755
--- a/tests/include-exclude
+++ b/tests/include-exclude
@@ -36,6 +36,10 @@ grep -r --exclude-dir=dir . x > out || fail=1
 sort out > k && mv k out
 compare exp-not-dir out || fail=1
 
+grep -r --exclude-dir=dir/ . x > out || fail=1
+sort out > k && mv k out
+compare exp-not-dir out || fail=1
+
 # Test with a non-glob.
 grep -r --include=a    . x > out || fail=1
 # no need to sort
-- 
1.9.0