svn commit: r332856 - head/usr.bin/grep

Kyle Evans kevans at FreeBSD.org
Sat Apr 21 13:46:08 UTC 2018


Author: kevans
Date: Sat Apr 21 13:46:07 2018
New Revision: 332856
URL: https://svnweb.freebsd.org/changeset/base/332856

Log:
  bsdgrep: Fix --include/--exclude ordering issues
  
  Prior to r332851:
  * --exclude always win out over --include
  * --exclude-dir always wins out over --include-dir
  
  r332851 broke that behavior, resulting in:
  * First of --exclude, --include wins
  * First of --exclude-dir, --include-dir wins
  
  As it turns out, both behaviors are wrong by modern grep standards- the
  latest rule wins. e.g.:
  
  `grep --exclude foo --include foo 'thing' foo`
  foo is included
  
  `grep --include foo --exclude foo 'thing' foo`
  foo is excluded
  
  As tested with GNU grep 3.1.
  
  This commit makes bsdgrep follow this behavior.
  
  Reported by:	se

Modified:
  head/usr.bin/grep/util.c

Modified: head/usr.bin/grep/util.c
==============================================================================
--- head/usr.bin/grep/util.c	Sat Apr 21 09:58:00 2018	(r332855)
+++ head/usr.bin/grep/util.c	Sat Apr 21 13:46:07 2018	(r332856)
@@ -109,10 +109,12 @@ file_matching(const char *fname)
 
 	for (unsigned int i = 0; i < fpatterns; ++i) {
 		if (fnmatch(fpattern[i].pat, fname, 0) == 0 ||
-		    fnmatch(fpattern[i].pat, fname_base, 0) == 0) {
+		    fnmatch(fpattern[i].pat, fname_base, 0) == 0)
+			/*
+			 * The last pattern matched wins exclusion/inclusion
+			 * rights, so we can't reasonably bail out early here.
+			 */
 			ret = (fpattern[i].mode != EXCL_PAT);
-			break;
-		}
 	}
 	free(fname_buf);
 	return (ret);
@@ -127,7 +129,11 @@ dir_matching(const char *dname)
 
 	for (unsigned int i = 0; i < dpatterns; ++i) {
 		if (dname != NULL && fnmatch(dpattern[i].pat, dname, 0) == 0)
-			return (dpattern[i].mode != EXCL_PAT);
+			/*
+			 * The last pattern matched wins exclusion/inclusion
+			 * rights, so we can't reasonably bail out early here.
+			 */
+			ret = (dpattern[i].mode != EXCL_PAT);
 	}
 	return (ret);
 }


More information about the svn-src-all mailing list