From 3a47ae13c230de7c735d722b7c250e6cf1302252 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 9ce064ac11..3589067dcc 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[] = { "git grep [options] [-e] [...] [[--] ...]", @@ -205,6 +206,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; @@ -215,6 +232,9 @@ static void *run(void *arg) if (!w) break; + if (skip_binary(opt, (const char *)w->identifier)) + continue; + opt->output_priv = w; if (w->type == WORK_SHA1) { unsigned long sz; @@ -530,6 +550,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 @@ -996,6 +1019,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