threads / patch / 22392

patchgrep: expose "status-only" feature via -q

Subject: [PATCH] grep: expose "status-only" feature via -q

## tl;dr

3 messages between Jan 25, 2010 and Jan 28, 2010. Diffs are folded; open one to read it.

replies: 2people: 2as markdown or json

Junio C Hamano· Jan 25, 2010, 23:37 UTC · lore

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(-)
Show changes to builtin-grep.c +14 −2
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;
Stephen Boyd· Jan 28, 2010, 16:32 UTC · re: Junio C Hamano · lore

Re: [PATCH] grep: expose "status-only" feature via -q

On 01/25/2010 03:37 PM, Junio C Hamano wrote:
Show 7 quoted lines
> @@ -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.

Junio C Hamano· Jan 28, 2010, 20:27 UTC · re: Stephen Boyd · lore

Re: [PATCH] grep: expose "status-only" feature via -q

Stephen Boyd <bebarino@gmail.com> writes:
Show 10 quoted lines
> 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.

← back to recent threads