diff --git a/builtin-grep.c b/builtin-grep.c index 73fc922c49..48998af911 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -278,6 +278,17 @@ static int flush_grep(struct grep_opt *opt, argc -= 2; } + if (opt->pre_context || opt->post_context) { + /* + * grep handles hunk marks between files, but we need to + * do that ourselves between multiple calls. + */ + if (opt->show_hunk_mark) + write_or_die(1, "--\n", 3); + else + opt->show_hunk_mark = 1; + } + status = exec_grep(argc, argv); if (kept_0) { diff --git a/grep.c b/grep.c index 6ee80f7fd9..4bca759b67 100644 --- a/grep.c +++ b/grep.c @@ -491,7 +491,12 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol, int rest = eol - bol; if (opt->pre_context || opt->post_context) { - if (opt->last_shown && lno > opt->last_shown + 1) + if (opt->last_shown == 0) { + if (opt->show_hunk_mark) + fputs("--\n", stdout); + else + opt->show_hunk_mark = 1; + } else if (lno > opt->last_shown + 1) fputs("--\n", stdout); } opt->last_shown = lno; diff --git a/grep.h b/grep.h index 0883214a09..730ffd6f53 100644 --- a/grep.h +++ b/grep.h @@ -85,6 +85,7 @@ struct grep_opt { unsigned pre_context; unsigned post_context; unsigned last_shown; + int show_hunk_mark; }; extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t); diff --git a/t/t7002-grep.sh b/t/t7002-grep.sh index 7868af8f18..155bfdb7d7 100755 --- a/t/t7002-grep.sh +++ b/t/t7002-grep.sh @@ -155,6 +155,28 @@ test_expect_success 'grep -e A --and --not -e B' ' test_cmp expected actual ' +cat >expected <y-$a$b; done; done && + git add y-?? && + git grep -C1 "^[yz]" >actual && + test_cmp expected actual +' + +test_expect_success 'grep -C1 --no-ext-grep, hunk mark between files' ' + git grep -C1 --no-ext-grep "^[yz]" >actual && + test_cmp expected actual +' + test_expect_success 'log grep setup' ' echo a >>file && test_tick &&