Re: [PATCH 2/4] diff.c: add --output-indicator-{new, old, context}
From: Johannes Schindelin <hidden>
Date: 2018-08-13 11:47:06
Hi Steafn, On Fri, 10 Aug 2018, Stefan Beller wrote:
This will prove useful in range-diff in a later patch as we will be able to differentiate between adding a new file (that line is starting with +++ and then the file name) and regular new lines.
Very good!
quoted hunk ↗ jump to hunk
It could also be useful for experimentation in new patch formats, i.e. we could teach git to emit moved lines with lines other than +/-. Signed-off-by: Stefan Beller <redacted> --- diff.c | 21 +++++++++++++++++---- diff.h | 5 +++++ 2 files changed, 22 insertions(+), 4 deletions(-)diff --git a/diff.c b/diff.c index b3cb73eb69a..b75eb085cb3 100644 --- a/diff.c +++ b/diff.c@@ -1237,7 +1237,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, struct emitted_diff_symbol *eds) { static const char *nneof = " No newline at end of file\n"; - const char *context, *reset, *set, *set_sign, *meta, *fraginfo; + const char *context, *reset, *set, *set_sign, *meta, *fraginfo, *first; struct strbuf sb = STRBUF_INIT; enum diff_symbol s = eds->s;@@ -1288,7 +1288,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, else if (c == '-') set = diff_get_color_opt(o, DIFF_FILE_OLD); } - emit_line_ws_markup(o, set_sign, set, reset, " ", line, len, + first = o->output_indicators[OI_CONTEXT] ? + o->output_indicators[OI_CONTEXT] : " "; + emit_line_ws_markup(o, set_sign, set, reset, first, line, len,
Instead of doing this over and over again, how about 1) setting o->output_indicators to " " in diff_setup()? 2) passing OI_CONTEXT to emit_line_ws_markup() instead of `first`? I.e. change it to the index in the output_indicators, with -1 indicating "none"?
quoted hunk ↗ jump to hunk
flags & (DIFF_SYMBOL_CONTENT_WS_MASK), 0); break; case DIFF_SYMBOL_PLUS:@@ -1331,7 +1333,10 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, set = diff_get_color_opt(o, DIFF_CONTEXT_BOLD); flags &= ~DIFF_SYMBOL_CONTENT_WS_MASK; } - emit_line_ws_markup(o, set_sign, set, reset, "+", line, len, + + first = o->output_indicators[OI_NEW] ? + o->output_indicators[OI_NEW] : "+"; + emit_line_ws_markup(o, set_sign, set, reset, first, line, len, flags & DIFF_SYMBOL_CONTENT_WS_MASK, flags & DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF); break;@@ -1374,7 +1379,9 @@ static void emit_diff_symbol_from_struct(struct diff_options *o, else set = diff_get_color_opt(o, DIFF_CONTEXT_DIM); } - emit_line_ws_markup(o, set_sign, set, reset, "-", line, len, + first = o->output_indicators[OI_OLD] ? + o->output_indicators[OI_OLD] : "-"; + emit_line_ws_markup(o, set_sign, set, reset, first, line, len, flags & DIFF_SYMBOL_CONTENT_WS_MASK, 0); break; case DIFF_SYMBOL_WORDS_PORCELAIN:@@ -4876,6 +4883,12 @@ int diff_opt_parse(struct diff_options *options, options->output_format |= DIFF_FORMAT_DIFFSTAT; } else if (!strcmp(arg, "--no-compact-summary")) options->flags.stat_with_summary = 0; + else if (skip_prefix(arg, "--output-indicator-new=", &arg)) + options->output_indicators[OI_NEW] = arg; + else if (skip_prefix(arg, "--output-indicator-old=", &arg)) + options->output_indicators[OI_OLD] = arg; + else if (skip_prefix(arg, "--output-indicator-context=", &arg)) + options->output_indicators[OI_CONTEXT] = arg; /* renames options */ else if (starts_with(arg, "-B") ||diff --git a/diff.h b/diff.h index e1e54256c18..2d4097df1c7 100644 --- a/diff.h +++ b/diff.h@@ -194,6 +194,11 @@ struct diff_options { FILE *file; int close_file; +#define OI_NEW 0 +#define OI_OLD 1 +#define OI_CONTEXT 2
I could imagine that OI_* is too generic a prefix, and that we would want to have a prefix that is less prone to collide with other global constants, such as OUTPUT_INDICATOR_*. Ciao, Dscho
+ const char *output_indicators[3]; + struct pathspec pathspec; pathchange_fn_t pathchange; change_fn_t change; -- 2.18.0.865.gffc8e1a3cd6-goog