* [PATCH] grep: expose "status-only" feature via -q
@ 2010-01-25 23:37 Junio C Hamano
2010-01-28 16:32 ` Stephen Boyd
0 siblings, 1 reply; 3+ messages in thread
From: Junio C Hamano @ 2010-01-25 23:37 UTC (permalink / raw)
To: git
Teach "git grep" a new "-q" option to report the presense of a match via
its exit status without showing any output, similar to how "grep -q"
works. Internally "grep" engine already knew this "status-only" mode of
operation because it needed to grep inside log message to filter commits
when called from the "git log" machinery, and this patch only exposes it
to the command line tool.
A somewhat unfair benchmark in the Linux kernel directory shows a dramatic
improvement:
(with patch)
$ time ../git.git/git grep -q linux HEAD ; echo $?
real 0m0.030s
user 0m0.004s
sys 0m0.004s
0
(without patch)
$ time git grep linux HEAD >/dev/null; echo $?
real 0m4.432s
user 0m4.272s
sys 0m0.076s
0
This is "somewhat unfair" because I knew a file with such a string comes
very early in the tree traversal (namely, ".gitignore").
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin-grep.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/builtin-grep.c b/builtin-grep.c
index da854fa..64cdfef 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -236,6 +236,8 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached)
!strcmp(ce->name, active_cache[nr]->name));
nr--; /* compensate for loop control */
}
+ if (hit && opt->status_only)
+ break;
}
free_grep_patterns(opt);
return hit;
@@ -293,6 +295,8 @@ static int grep_tree(struct grep_opt *opt, const char **paths,
hit |= grep_tree(opt, paths, &sub, tree_name, down);
free(data);
}
+ if (hit && opt->status_only)
+ break;
}
strbuf_release(&pathbuf);
return hit;
@@ -329,8 +333,11 @@ static int grep_directory(struct grep_opt *opt, const char **paths)
setup_standard_excludes(&dir);
fill_directory(&dir, paths);
- for (i = 0; i < dir.nr; i++)
+ for (i = 0; i < dir.nr; i++) {
hit |= grep_file(opt, dir.entries[i]->name);
+ if (hit && opt->status_only)
+ break;
+ }
free_grep_patterns(opt);
return hit;
}
@@ -505,6 +512,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
{ OPTION_CALLBACK, ')', NULL, &opt, NULL, "",
PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
close_callback },
+ OPT_BOOLEAN('q', "quick", &opt.status_only,
+ "indicate hit with exit status without output"),
OPT_BOOLEAN(0, "all-match", &opt.all_match,
"show only matches from files that match all patterns"),
OPT_GROUP(""),
@@ -628,8 +637,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
for (i = 0; i < list.nr; i++) {
struct object *real_obj;
real_obj = deref_tag(list.objects[i].item, NULL, 0);
- if (grep_object(&opt, paths, real_obj, list.objects[i].name))
+ if (grep_object(&opt, paths, real_obj, list.objects[i].name)) {
hit = 1;
+ if (opt.status_only)
+ break;
+ }
}
free_grep_patterns(&opt);
return !hit;
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] grep: expose "status-only" feature via -q
2010-01-25 23:37 [PATCH] grep: expose "status-only" feature via -q Junio C Hamano
@ 2010-01-28 16:32 ` Stephen Boyd
2010-01-28 20:27 ` Junio C Hamano
0 siblings, 1 reply; 3+ messages in thread
From: Stephen Boyd @ 2010-01-28 16:32 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
On 01/25/2010 03:37 PM, Junio C Hamano wrote:
> @@ -505,6 +512,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
> { OPTION_CALLBACK, ')', NULL,&opt, NULL, "",
> PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
> close_callback },
> + OPT_BOOLEAN('q', "quick",&opt.status_only,
> + "indicate hit with exit status without output"),
>
Why isn't this --quiet just like grep? I think this might be mistaken
for enabling threads or some fancy algorithm to go faster.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] grep: expose "status-only" feature via -q
2010-01-28 16:32 ` Stephen Boyd
@ 2010-01-28 20:27 ` Junio C Hamano
0 siblings, 0 replies; 3+ messages in thread
From: Junio C Hamano @ 2010-01-28 20:27 UTC (permalink / raw)
To: Stephen Boyd; +Cc: git
Stephen Boyd <bebarino@gmail.com> writes:
> On 01/25/2010 03:37 PM, Junio C Hamano wrote:
>> @@ -505,6 +512,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
>> { OPTION_CALLBACK, ')', NULL,&opt, NULL, "",
>> PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
>> close_callback },
>> + OPT_BOOLEAN('q', "quick",&opt.status_only,
>> + "indicate hit with exit status without output"),
>>
>
> Why isn't this --quiet just like grep?
Because I wasn't careful enough. Thanks; will fix.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-01-28 20:28 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-25 23:37 [PATCH] grep: expose "status-only" feature via -q Junio C Hamano
2010-01-28 16:32 ` Stephen Boyd
2010-01-28 20:27 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).