From 87dd0451156c5d7883a495d10d560ac70f192867 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 3d5f6ace97..7e5b60a516 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" #ifndef NO_PTHREADS #include @@ -183,6 +184,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_checkattr(filename, 1, &check) && + ATTR_FALSE(check.value); + } + return 0; +} + static void *run(void *arg) { int hit = 0; @@ -193,6 +210,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; @@ -597,6 +617,9 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached) continue; if (!pathspec_matches(paths, ce->name, opt->max_depth)) 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 @@ -1007,6 +1030,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