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 <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin
2010-11-08 16:10:43 +01:00
parent 0a8611c416
commit 1743aae8c8

View File

@@ -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] <pattern> [<rev>...] [[--] <path>...]",
@@ -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);
@@ -418,6 +438,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
@@ -883,6 +906,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."));