Hi Stefan, On Fri, 10 Aug 2018, Stefan Beller wrote: > For now just change the signature, we'll reason about the actual > change in a follow up patch. > > Pass 'set_sign' (which is output before the sign) and 'set' which > controls the color after the first character. Hence, promote any > 'set's to 'set_sign' as we want to have color before the sign > for now. I'll freely admit that I had to study the diff in order to understand this paragraph. My I suggest something along those lines instead? Split the meaning of the `set` parameter that is passed to `emit_line_0()` to separate between the color of the "sign" (i.e. the diff marker '+', '-' or ' ' that is passed in as the `first` parameter) and the color of the rest of the line. This changes the meaning of the `set` parameter to no longer refer to the color of the diff marker, but instead to refer to the color of the rest of the line. A value of `NULL` indicates that the rest of the line wants to be colored the same as the diff marker. Ciao, Dscho > > Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> > Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> > --- > diff.c | 21 ++++++++++++--------- > 1 file changed, 12 insertions(+), 9 deletions(-) > > diff --git a/diff.c b/diff.c > index ab6e6a88a56..5eea5edca50 100644 > --- a/diff.c > +++ b/diff.c > @@ -622,7 +622,7 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2, > } > > static void emit_line_0(struct diff_options *o, > - const char *set, unsigned reverse, const char *reset, > + const char *set_sign, const char *set, unsigned reverse, const char *reset, > int first, const char *line, int len) > { > int has_trailing_newline, has_trailing_carriage_return; > @@ -652,9 +652,12 @@ static void emit_line_0(struct diff_options *o, > if (len || !nofirst) { > if (reverse && want_color(o->use_color)) > fputs(GIT_COLOR_REVERSE, file); > - fputs(set, file); > + if (set_sign && set_sign[0]) > + fputs(set_sign, file); > if (first && !nofirst) > fputc(first, file); > + if (set) > + fputs(set, file); > fwrite(line, len, 1, file); > fputs(reset, file); > } > @@ -667,7 +670,7 @@ static void emit_line_0(struct diff_options *o, > static void emit_line(struct diff_options *o, const char *set, const char *reset, > const char *line, int len) > { > - emit_line_0(o, set, 0, reset, line[0], line+1, len-1); > + emit_line_0(o, set, NULL, 0, reset, line[0], line+1, len-1); > } > > enum diff_symbol { > @@ -1199,17 +1202,17 @@ static void emit_line_ws_markup(struct diff_options *o, > } > > if (!ws && !set_sign) > - emit_line_0(o, set, 0, reset, sign, line, len); > + emit_line_0(o, set, NULL, 0, reset, sign, line, len); > else if (!ws) { > /* Emit just the prefix, then the rest. */ > - emit_line_0(o, set_sign, !!set_sign, reset, sign, "", 0); > - emit_line_0(o, set, 0, reset, 0, line, len); > + emit_line_0(o, set_sign, NULL, !!set_sign, reset, sign, "", 0); > + emit_line_0(o, set, NULL, 0, reset, 0, line, len); > } else if (blank_at_eof) > /* Blank line at EOF - paint '+' as well */ > - emit_line_0(o, ws, 0, reset, sign, line, len); > + emit_line_0(o, ws, NULL, 0, reset, sign, line, len); > else { > /* Emit just the prefix, then the rest. */ > - emit_line_0(o, set_sign ? set_sign : set, !!set_sign, reset, > + emit_line_0(o, set_sign ? set_sign : set, NULL, !!set_sign, reset, > sign, "", 0); > ws_check_emit(line, len, ws_rule, > o->file, set, reset, ws); > @@ -1233,7 +1236,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, > context = diff_get_color_opt(o, DIFF_CONTEXT); > reset = diff_get_color_opt(o, DIFF_RESET); > putc('\n', o->file); > - emit_line_0(o, context, 0, reset, '\\', > + emit_line_0(o, context, NULL, 0, reset, '\\', > nneof, strlen(nneof)); > break; > case DIFF_SYMBOL_SUBMODULE_HEADER: > -- > 2.18.0.865.gffc8e1a3cd6-goog > >