grep: add --break

With --break, an empty line is printed between matches from different
files, increasing readability.  This option is taken from ack
(http://betterthangrep.com/).

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-06-05 17:24:25 +02:00 committed by Junio C Hamano
parent 08303c3636
commit a8f0e7649e
5 changed files with 40 additions and 3 deletions

View File

@ -148,6 +148,9 @@ OPTIONS
gives the default to color output. gives the default to color output.
Same as `--color=never`. Same as `--color=never`.
--break::
Print an empty line between matches from different files.
-[ABC] <context>:: -[ABC] <context>::
Show `context` trailing (`A` -- after), or leading (`B` Show `context` trailing (`A` -- after), or leading (`B`
-- before), or both (`C` -- context) lines, and place a -- before), or both (`C` -- context) lines, and place a

View File

@ -822,6 +822,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
OPT_BOOLEAN('c', "count", &opt.count, OPT_BOOLEAN('c', "count", &opt.count,
"show the number of matches instead of matching lines"), "show the number of matches instead of matching lines"),
OPT__COLOR(&opt.color, "highlight matches"), OPT__COLOR(&opt.color, "highlight matches"),
OPT_BOOLEAN(0, "break", &opt.file_break,
"print empty line between matches from different files"),
OPT_GROUP(""), OPT_GROUP(""),
OPT_CALLBACK('C', NULL, &opt, "n", OPT_CALLBACK('C', NULL, &opt, "n",
"show <n> context lines before and after matches", "show <n> context lines before and after matches",
@ -976,7 +978,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
use_threads = 0; use_threads = 0;
if (use_threads) { if (use_threads) {
if (opt.pre_context || opt.post_context) if (opt.pre_context || opt.post_context || opt.file_break)
skip_first_line = 1; skip_first_line = 1;
start_threads(&opt); start_threads(&opt);
} }

7
grep.c
View File

@ -721,7 +721,10 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
int rest = eol - bol; int rest = eol - bol;
char *line_color = NULL; char *line_color = NULL;
if (opt->pre_context || opt->post_context) { if (opt->file_break && opt->last_shown == 0) {
if (opt->show_hunk_mark)
opt->output(opt, "\n", 1);
} else if (opt->pre_context || opt->post_context) {
if (opt->last_shown == 0) { if (opt->last_shown == 0) {
if (opt->show_hunk_mark) { if (opt->show_hunk_mark) {
output_color(opt, "--", 2, opt->color_sep); output_color(opt, "--", 2, opt->color_sep);
@ -941,7 +944,7 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
if (!opt->output) if (!opt->output)
opt->output = std_output; opt->output = std_output;
if (opt->pre_context || opt->post_context) { if (opt->pre_context || opt->post_context || opt->file_break) {
/* Show hunk marks, except for the first file. */ /* Show hunk marks, except for the first file. */
if (opt->last_shown) if (opt->last_shown)
opt->show_hunk_mark = 1; opt->show_hunk_mark = 1;

1
grep.h
View File

@ -110,6 +110,7 @@ struct grep_opt {
unsigned post_context; unsigned post_context;
unsigned last_shown; unsigned last_shown;
int show_hunk_mark; int show_hunk_mark;
int file_break;
void *priv; void *priv;
void (*output)(struct grep_opt *opt, const void *data, size_t size); void (*output)(struct grep_opt *opt, const void *data, size_t size);

View File

@ -746,4 +746,32 @@ test_expect_success 'grep --color, separator' '
test_cmp expected actual test_cmp expected actual
' '
cat >expected <<EOF
hello.c:int main(int argc, const char **argv)
hello.c: /* char ?? */
hello_world:Hello_world
EOF
test_expect_success 'grep --break' '
git grep --break -e char -e lo_w hello.c hello_world >actual &&
test_cmp expected actual
'
cat >expected <<EOF
hello.c:int main(int argc, const char **argv)
hello.c-{
--
hello.c: /* char ?? */
hello.c-}
hello_world:Hello_world
hello_world-HeLLo_world
EOF
test_expect_success 'grep --break with context' '
git grep --break -A1 -e char -e lo_w hello.c hello_world >actual &&
test_cmp expected actual
'
test_done test_done