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 <sbeller@xxxxxxxxxx> wrote: >> Ævar asked for it, this is how you would do it. >> (plus documentation, tests, CLI knobs, options) >> >> Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> >> --- >> 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 >>