git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 7/8] diff.c: compute reverse locally in emit_line_0

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Aug 13, 2018, 12:26 UTC
Message-ID
<nycvar.QRO.7.76.6.1808131422580.71@tvgsbejvaqbjf.bet>
In-Reply-To
<20180810223441.30428-8-sbeller@google.com>
Hi,
On Fri, 10 Aug 2018, Stefan Beller wrote:
> Signed-off-by: Stefan Beller <sbeller@google.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Well, my rationale for having the explicit `reverse` parameter is: this code is complex enough, introducing some magic "this and that implies this" makes it much harder to understand.

So I am not at all sure that this is a good thing.
Show 19 quoted lines
> ---
>  diff.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
> 
> diff --git a/diff.c b/diff.c
> index 01095a59d3d..e50cd312755 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -622,11 +622,12 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,
>  }
>  
>  static void emit_line_0(struct diff_options *o,
> -			const char *set_sign, const char *set, unsigned reverse, const char *reset,
> +			const char *set_sign, const char *set, const char *reset,
>  			int first, const char *line, int len)
>  {
>  	int has_trailing_newline, has_trailing_carriage_return;
>  	int nofirst;
> +	int reverse = !!set && !!set_sign;

In contrast to, say, Javascript which has this nice feature that you can write `set || set_sign` to mean `set ? set : set_sign`, I am fairly certain that `set && set_sign` already evaluates to `0` or `1`. No need for all those exclamation marks!!!!

:-)

But as I said: I think it is a bit too magic for my liking to say "if the diff marker color is specified as well as the color for the rest of the line, then the diff marker will be reversed". That's just making the code hard to understand, i.e. less readable rather than more.

Ciao, Dscho

Show 45 quoted lines
>  	FILE *file = o->file;
>  
>  	fputs(diff_line_prefix(o), file);
> @@ -671,7 +672,7 @@ static void emit_line_0(struct diff_options *o,
>  static void emit_line(struct diff_options *o, const char *set, const char *reset,
>  		      const char *line, int len)
>  {
> -	emit_line_0(o, set, NULL, 0, reset, line[0], line+1, len-1);
> +	emit_line_0(o, set, NULL, reset, line[0], line+1, len-1);
>  }
>  
>  enum diff_symbol {
> @@ -1203,15 +1204,15 @@ static void emit_line_ws_markup(struct diff_options *o,
>  	}
>  
>  	if (!ws && !set_sign)
> -		emit_line_0(o, set, NULL, 0, reset, sign, line, len);
> +		emit_line_0(o, set, NULL, reset, sign, line, len);
>  	else if (!ws) {
> -		emit_line_0(o, set_sign, set, !!set_sign, reset, sign, line, len);
> +		emit_line_0(o, set_sign, set, reset, sign, line, len);
>  	} else if (blank_at_eof)
>  		/* Blank line at EOF - paint '+' as well */
> -		emit_line_0(o, ws, NULL, 0, reset, sign, line, len);
> +		emit_line_0(o, ws, NULL, reset, sign, line, len);
>  	else {
>  		/* Emit just the prefix, then the rest. */
> -		emit_line_0(o, set_sign, set, !!set_sign, reset, sign, "", 0);
> +		emit_line_0(o, set_sign, set, reset, sign, "", 0);
>  		ws_check_emit(line, len, ws_rule,
>  			      o->file, set, reset, ws);
>  	}
> @@ -1234,7 +1235,7 @@ static void emit_diff_symbol_from_struct(struct diff_options *o,
>  		context = diff_get_color_opt(o, DIFF_CONTEXT);
>  		reset = diff_get_color_opt(o, DIFF_RESET);
>  		putc('\n', o->file);
> -		emit_line_0(o, context, NULL, 0, reset, '\\',
> +		emit_line_0(o, context, NULL, reset, '\\',
>  			    nneof, strlen(nneof));
>  		break;
>  	case DIFF_SYMBOL_SUBMODULE_HEADER:
> -- 
> 2.18.0.865.gffc8e1a3cd6-goog
> 
> 
Previous: Stefan BellerNext: Stefan Beller
Message 16 of 32 in “Resending sb/range-diff-colors”
  1. 0/8 Resending sb/range-diff-colorsStefan Beller, Aug 10, 2018
  2. 1/8 test_decode_color: understand FAINT and ITALICStefan Beller, Aug 10, 2018
  3. 2/8 t3206: add color test for range-diff --dual-colorStefan Beller, Aug 10, 2018
  4. Johannes SchindelinAug 13, 2018
  5. Stefan BellerAug 13, 2018
  6. 3/8 diff.c: simplify caller of emit_line_0Stefan Beller, Aug 10, 2018
  7. Johannes SchindelinAug 13, 2018
  8. 4/8 diff.c: reorder arguments for emit_line_ws_markupStefan Beller, Aug 10, 2018
  9. Johannes SchindelinAug 13, 2018
  10. 5/8 diff.c: add set_sign to emit_line_0Stefan Beller, Aug 10, 2018
  11. Johannes SchindelinAug 13, 2018
  12. Stefan BellerAug 13, 2018
  13. 6/8 diff: use emit_line_0 once per lineStefan Beller, Aug 10, 2018
  14. Johannes SchindelinAug 13, 2018
  15. 7/8 diff.c: compute reverse locally in emit_line_0Stefan Beller, Aug 10, 2018
  16. Johannes SchindelinAug 13, 2018
  17. Stefan BellerAug 13, 2018
  18. 8/8 diff.c: rewrite emit_line_0 more understandablyStefan Beller, Aug 10, 2018
  19. Johannes SchindelinAug 13, 2018
  20. Stefan BellerAug 13, 2018
  21. Stefan BellerAug 13, 2018
  22. 0/8 Resending sb/range-diff-colorsStefan Beller, Aug 14, 2018
  23. 1/8 test_decode_color: understand FAINT and ITALICStefan Beller, Aug 14, 2018
  24. 2/8 t3206: add color test for range-diff --dual-colorStefan Beller, Aug 14, 2018
  25. 3/8 diff.c: simplify caller of emit_line_0Stefan Beller, Aug 14, 2018
  26. 4/8 diff.c: reorder arguments for emit_line_ws_markupStefan Beller, Aug 14, 2018
  27. 5/8 diff.c: add set_sign to emit_line_0Stefan Beller, Aug 14, 2018
  28. 6/8 diff: use emit_line_0 once per lineStefan Beller, Aug 14, 2018
  29. 7/8 diff.c: omit check for line prefix in emit_line_0Stefan Beller, Aug 14, 2018
  30. 8/8 diff.c: rewrite emit_line_0 more understandablyStefan Beller, Aug 14, 2018
  31. Johannes SchindelinAug 14, 2018
  32. Stefan BellerAug 14, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.