git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] grep: read patterns from stdin with -f -

From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
Date
Mar 19, 2011, 18:33 UTC
Message-ID
<4D84F6EB.5000009@lsrfire.ath.cx>

Support the well-know convention of reading standard input instead of a named file if "-" (dash) is specified. GNU grep does the same.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
---
I was trying to look for the string "/pack", but MinGW mangles arguments
that look like paths.  "echo /pack | git grep -f-" was my first try to
circumvent this, as echo's arguments are not mangled.  I ended up with
"git grep '[/]pack'" -- and also this patch.
 builtin/grep.c  |    6 ++++--
 t/t7810-grep.sh |    5 +++++
 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/builtin/grep.c b/builtin/grep.c
index eaf8560..0bf8c01 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -659,11 +659,12 @@ static int context_callback(const struct option *opt, const char *arg,
 static int file_callback(const struct option *opt, const char *arg, int unset)
 {
 	struct grep_opt *grep_opt = opt->value;
+	int from_stdin = !strcmp(arg, "-");
 	FILE *patterns;
 	int lno = 0;
 	struct strbuf sb = STRBUF_INIT;
 
-	patterns = fopen(arg, "r");
+	patterns = from_stdin ? stdin : fopen(arg, "r");
 	if (!patterns)
 		die_errno("cannot open '%s'", arg);
 	while (strbuf_getline(&sb, patterns, '\n') == 0) {
@@ -677,7 +678,8 @@ static int file_callback(const struct option *opt, const char *arg, int unset)
 		s = strbuf_detach(&sb, &len);
 		append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN);
 	}
-	fclose(patterns);
+	if (!from_stdin)
+		fclose(patterns);
 	strbuf_release(&sb);
 	return 0;
 }
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 8a7788d..dbc6cd8 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -303,6 +303,11 @@ test_expect_success 'grep -f, ignore empty lines' '
 	test_cmp expected actual
 '
 
+test_expect_success 'grep -f, ignore empty lines, read patterns from stdin' '
+	git grep -f - <patterns >actual &&
+	test_cmp expected actual
+'
+
 cat >expected <<EOF
 y:y yy
 --
-- 
1.7.4
Message 1 of 1 in “grep: read patterns from stdin with -f -”
  1. grep: read patterns from stdin with -f -René Scharfe, Mar 19, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.