Re: [showing-off RFC/PATCH 26/26] diff.c: have a "machine parseable" move coloring
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Jun 23, 2017, 21:43 UTC
- Message-ID
- <8737aqjs6q.fsf@gmail.com>
- In-Reply-To
- <CAGZ79kYLdpaXzn0T5547fRr=EPR691n2bPfS+mzaZuS-k39ayw@mail.gmail.com>
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.
Show 82 quoted lines
> On Mon, Jun 19, 2017 at 7:48 PM, Stefan Beller <sbeller@google.com> wrote:
>> Ævar asked for it, this is how you would do it.
>> (plus documentation, tests, CLI knobs, options)
>>
>> Signed-off-by: Stefan Beller <sbeller@google.com>
>> ---
>> 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
>>