[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