Subject: Re: [showing-off RFC/PATCH 26/26] diff.c: have a "machine parseable" move coloring

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Fri, 23 Jun 2017 23:43:41 +0200

On Tue, Jun 20 2017, Stefan Beller jotted:

> + Ævar, who was not part of the email where I copied all recipients
> from for this series.

I played around with this a bit, it would be great to have something
like this on top of --color-moved eventually. It's a lot easier to /^_
in a pager than looking for color codes.

Of course it's diff-incompatible output, but it's fair enough to have
that hidden behind some option IMO.

> On Mon, Jun 19, 2017 at 7:48 PM, Stefan Beller <[email-masked]> wrote:
>> Ævar asked for it, this is how you would do it.
>> (plus documentation, tests, CLI knobs, options)
>>
>> Signed-off-by: Stefan Beller <[email-masked]>
>> ---
>>  diff.c | 15 +++++++++++----
>>  diff.h |  2 ++
>>  2 files changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/diff.c b/diff.c
>> index 7756f7610c..61caa057ff 100644
>> --- a/diff.c
>> +++ b/diff.c
>> @@ -997,6 +997,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
>>         static const char *nneof = " No newline at end of file\n";
>>         const char *context, *reset, *set, *meta, *fraginfo;
>>         struct strbuf sb = STRBUF_INIT;
>> +       int sign;
>>
>>         enum diff_symbol s = eds->s;
>>         const char *line = eds->line;
>> @@ -1058,8 +1059,11 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
>>                 default:
>>                         set = diff_get_color_opt(o, DIFF_FILE_NEW);
>>                 }
>> +               sign = '+';
>> +               if (flags & DIFF_SYMBOL_MOVED_LINE && o->machine_readable_moves)
>> +                       sign = '*';
>>                 reset = diff_get_color_opt(o, DIFF_RESET);
>> -               emit_line_ws_markup(o, set, reset, line, len, '+',
>> +               emit_line_ws_markup(o, set, reset, line, len, sign,
>>                                     flags & DIFF_SYMBOL_CONTENT_WS_MASK,
>>                                     flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF);
>>                 break;
>> @@ -1086,8 +1090,11 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
>>                 default:
>>                         set = diff_get_color_opt(o, DIFF_FILE_OLD);
>>                 }
>> +               sign = '-';
>> +               if (flags & DIFF_SYMBOL_MOVED_LINE && o->machine_readable_moves)
>> +                       sign = '_';
>>                 reset = diff_get_color_opt(o, DIFF_RESET);
>> -               emit_line_ws_markup(o, set, reset, line, len, '-',
>> +               emit_line_ws_markup(o, set, reset, line, len, sign,
>>                                     flags & DIFF_SYMBOL_CONTENT_WS_MASK, 0);
>>                 break;
>>         case DIFF_SYMBOL_WORDS_PORCELAIN:
>> @@ -5475,7 +5482,7 @@ static void diff_flush_patch_all_file_pairs(struct diff_options *o)
>>         static struct emitted_diff_symbols esm = EMITTED_DIFF_SYMBOLS_INIT;
>>         struct diff_queue_struct *q = &diff_queued_diff;
>>
>> -       if (o->color_moved)
>> +       if (o->color_moved || o->machine_readable_moves)
>>                 o->emitted_symbols = &esm;
>>
>>         for (i = 0; i < q->nr; i++) {
>> @@ -5485,7 +5492,7 @@ static void diff_flush_patch_all_file_pairs(struct diff_options *o)
>>         }
>>
>>         if (o->emitted_symbols) {
>> -               if (o->color_moved) {
>> +               if (o->color_moved || o->machine_readable_moves) {
>>                         struct hashmap add_lines, del_lines;
>>                         unsigned ignore_ws = DIFF_XDL_TST(o, IGNORE_WHITESPACE);
>>
>> diff --git a/diff.h b/diff.h
>> index 98abd75521..b6c4d7ab0f 100644
>> --- a/diff.h
>> +++ b/diff.h
>> @@ -194,6 +194,8 @@ struct diff_options {
>>                 COLOR_MOVED_ZEBRA = 2,
>>                 COLOR_MOVED_ZEBRA_DIM = 3,
>>         } color_moved;
>> +
>> +       int machine_readable_moves;
>>  };
>>
>>  void diff_emit_submodule_del(struct diff_options *o, const char *line);
>> --
>> 2.12.2.575.gb14f27f917
>>