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 <[email protected]>
> Signed-off-by: Junio C Hamano <[email protected]>
> ---
>  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
> 
> 

Reply via email to