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! > 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 <sbeller@xxxxxxxxxx> > --- > 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"? > 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 > >