grep: read patterns from stdin with -f -

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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe 2011-03-19 19:33:15 +01:00 committed by Junio C Hamano
parent af4c62ae88
commit c41dd2fd7d
2 changed files with 9 additions and 2 deletions

View file

@ -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;
}

View file

@ -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
--