mirror of
https://github.com/git/git
synced 2024-09-13 21:34:42 +00:00
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:
parent
308f835490
commit
97adaf0310
|
@ -18,6 +18,7 @@
|
||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "thread-utils.h"
|
#include "thread-utils.h"
|
||||||
|
#include "attr.h"
|
||||||
|
|
||||||
static char const * const grep_usage[] = {
|
static char const * const grep_usage[] = {
|
||||||
"git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
|
"git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
|
||||||
|
@ -187,6 +188,22 @@ static void work_done(struct work_item *w)
|
||||||
grep_unlock();
|
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)
|
static void *run(void *arg)
|
||||||
{
|
{
|
||||||
int hit = 0;
|
int hit = 0;
|
||||||
|
@ -197,6 +214,9 @@ static void *run(void *arg)
|
||||||
if (!w)
|
if (!w)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (skip_binary(opt, (const char *)w->identifier))
|
||||||
|
continue;
|
||||||
|
|
||||||
opt->output_priv = w;
|
opt->output_priv = w;
|
||||||
if (w->type == WORK_SHA1) {
|
if (w->type == WORK_SHA1) {
|
||||||
unsigned long sz;
|
unsigned long sz;
|
||||||
|
@ -514,6 +534,9 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
|
||||||
continue;
|
continue;
|
||||||
if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL))
|
if (!match_pathspec_depth(pathspec, ce->name, ce_namelen(ce), 0, NULL))
|
||||||
continue;
|
continue;
|
||||||
|
if (skip_binary(opt, ce->name))
|
||||||
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If CE_VALID is on, we assume worktree file and its cache entry
|
* If CE_VALID is on, we assume worktree file and its cache entry
|
||||||
* are identical, even if worktree file has been modified, so use
|
* are identical, even if worktree file has been modified, so use
|
||||||
|
@ -979,6 +1002,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
||||||
string_list_append(&path_list, show_in_pager);
|
string_list_append(&path_list, show_in_pager);
|
||||||
use_threads = 0;
|
use_threads = 0;
|
||||||
}
|
}
|
||||||
|
if ((opt.binary & GREP_BINARY_NOMATCH))
|
||||||
|
use_threads = 0;
|
||||||
|
|
||||||
if (!opt.pattern_list)
|
if (!opt.pattern_list)
|
||||||
die(_("no pattern given."));
|
die(_("no pattern given."));
|
||||||
|
|
Loading…
Reference in a new issue