Zoltan Klinger <zoltan.klinger@xxxxxxxxx> writes: > When git grep is run with combined patterns such as '-e p1 --and -e p2' > and surrounding context lines are requested, the output contains > incorrectly highlighted matches. > > Consider the following output (highlighted matches are surrounded by '*' > characters): > $ cat testfile > foo a > foo b > foo bar > baz bar foo > bar x > bar y > $ git grep -n -C2 -e foo --and -e bar testfile > testfile-1-*foo* a > testfile-2-*foo* b > testfile:3:*foo* *bar* > testfile:4:baz *bar* *foo* > testfile-5-*bar* x > testfile-6-*bar* y > > Lines 1, 2, 5 and 6 do not match the combined patterns, they only > contain incorrectly highlighted 'false positives'. > > Modify the show_line() function in grep.c to highlight matches only on > lines that match the combined pattern. Do not highlight matches on lines > that provide only context or contain only the function name of the match. > > The output of the same command after the change: > $ git grep -n -C2 -e foo --and -e bar testfile > testfile-1-foo a > testfile-2-foo b > testfile:3:*foo* *bar* > testfile:4:baz *bar* *foo* > testfile-5-bar x > testfile-6-bar y If your goal is to stop colouring words on context and other kinds of lines, do you still need the "while (next_match(...))" loop for them? Can't you make the resulting code clearer by restructuring the inside of the whole "if (opt->color)" block further, something along the lines of... if (sign != ':') { regmatch_t match; ... enum grep_context ctx = GREP_CONTEXT_BODY; ... while (next_match(...)) { ... the "word-by-word" loop ... } } else { switch (sign) { case '-': line_color = opt->color_context; break; case ':': line_color = opt->color_function; break; } output_color(opt, bol, ..., line_color); } Hmm? -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html