diff --git a/builtin/grep.c b/builtin/grep.c index 40b9a93127482bebf6dc8c9eb39b2104711a543a..f427d55f274889a7fcfbd12e3c21678ad947f32e 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -96,6 +96,9 @@ static pthread_cond_t cond_write; /* Signalled when we are finished with everything. */ static pthread_cond_t cond_result; +static int print_hunk_marks_between_files; +static int printed_something; + static void add_work(enum work_type type, char *name, void *id) { grep_lock(); @@ -159,7 +162,12 @@ static void work_done(struct work_item *w) for(; todo[todo_done].done && todo_done != todo_start; todo_done = (todo_done+1) % ARRAY_SIZE(todo)) { w = &todo[todo_done]; - write_or_die(1, w->out.buf, w->out.len); + if (w->out.len) { + if (print_hunk_marks_between_files && printed_something) + write_or_die(1, "--\n", 3); + write_or_die(1, w->out.buf, w->out.len); + printed_something = 1; + } free(w->name); free(w->identifier); } @@ -926,8 +934,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix) if (online_cpus() == 1 || !grep_threads_ok(&opt)) use_threads = 0; - if (use_threads) + if (use_threads) { + if (opt.pre_context || opt.post_context) + print_hunk_marks_between_files = 1; start_threads(&opt); + } #else use_threads = 0; #endif diff --git a/grep.c b/grep.c index 90a063a985098976f831c37227496d612fae37c0..e5f06e435f2a8100676cd2a5b78312fcd8631717 100644 --- a/grep.c +++ b/grep.c @@ -551,8 +551,6 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol, if (opt->last_shown == 0) { if (opt->show_hunk_mark) opt->output(opt, "--\n", 3); - else - opt->show_hunk_mark = 1; } else if (lno > opt->last_shown + 1) opt->output(opt, "--\n", 3); } @@ -750,14 +748,6 @@ int grep_threads_ok(const struct grep_opt *opt) !opt->name_only) return 0; - /* If we are showing hunk marks, we should not do it for the - * first match. The synchronization problem we get for this - * constraint is not yet solved, so we disable threading in - * this case. - */ - if (opt->pre_context || opt->post_context) - return 0; - return 1; } @@ -779,11 +769,14 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name, enum grep_context ctx = GREP_CONTEXT_HEAD; xdemitconf_t xecfg; - opt->last_shown = 0; - if (!opt->output) opt->output = std_output; + if (opt->last_shown && (opt->pre_context || opt->post_context) && + opt->output == std_output) + opt->show_hunk_mark = 1; + opt->last_shown = 0; + if (buffer_is_binary(buf, size)) { switch (opt->binary) { case GREP_BINARY_DEFAULT: