From 050e8e06c92909a1531f893deb903c9b92d3494c Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 8 Nov 2010 16:10:43 +0100 Subject: [PATCH] grep -I: do not bother to read known-binary files Incidentally, this makes grep -I respect the "binary" attribute (actually, the "-text" attribute, but "binary" implies that). Since the attributes are not thread-safe, we now need to switch off threading if -I was passed. Signed-off-by: Johannes Schindelin --- builtin/grep.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/builtin/grep.c b/builtin/grep.c index a132e8909e..ea3323acbf 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -17,6 +17,7 @@ #include "grep.h" #include "quote.h" #include "dir.h" +#include "attr.h" static char const * const grep_usage[] = { N_("git grep [options] [-e] [...] [[--] ...]"), @@ -162,6 +163,22 @@ static void work_done(struct work_item *w) grep_unlock(); } +static int skip_binary(struct grep_opt *opt, const char *filename) +{ + if ((opt->binary & GREP_BINARY_NOMATCH)) { + static struct git_attr *attr_text; + struct git_attr_check check; + + if (!attr_text) + attr_text = git_attr("text"); + memset(&check, 0, sizeof(check)); + check.attr = attr_text; + return !git_check_attr(filename, 1, &check) && + ATTR_FALSE(check.value); + } + return 0; +} + static void *run(void *arg) { int hit = 0; @@ -172,6 +189,9 @@ static void *run(void *arg) if (!w) break; + if (skip_binary(opt, (const char *)w->source.identifier)) + continue; + opt->output_priv = w; hit |= grep_source(opt, &w->source); grep_source_clear_data(&w->source); @@ -471,6 +491,9 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int continue; if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL)) continue; + if (skip_binary(opt, ce->name)) + continue; + /* * If CE_VALID is on, we assume worktree file and its cache entry * are identical, even if worktree file has been modified, so use @@ -916,6 +939,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) string_list_append(&path_list, show_in_pager); use_threads = 0; } + if ((opt.binary & GREP_BINARY_NOMATCH)) + use_threads = 0; if (!opt.pattern_list) die(_("no pattern given.")); -- 2.11.4.GIT