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

Re: [PATCH 2/2] grep.c: teach 'git grep --only-matching'

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 27, 2018, 16:40 UTC
Message-ID
<xmqqsh58gp3p.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<f156bd7c897359926ec407e805ecb0630a8b12da.1529961706.git.me@ttaylorr.com>
Taylor Blau <me@ttaylorr.com> writes:
Show 22 quoted lines
> -		if (sign == ':')
> -			match_color = opt->color_match_selected;
> -		else
> -			match_color = opt->color_match_context;
> -		if (sign == ':')
> -			line_color = opt->color_selected;
> -		else if (sign == '-')
> -			line_color = opt->color_context;
> -		else if (sign == '=')
> -			line_color = opt->color_function;
> +		if (opt->color) {
> +			if (sign == ':')
> +				match_color = opt->color_match_selected;
> +			else
> +				match_color = opt->color_match_context;
> +			if (sign == ':')
> +				line_color = opt->color_selected;
> +			else if (sign == '-')
> +				line_color = opt->color_context;
> +			else if (sign == '=')
> +				line_color = opt->color_function;
> +		}

The above change (specifically, the fact that this now is enclosed in "if (opt->color) { ... }") unfortunately leaves match_color undefined at this point in the control flow. The next loop then calls output_color() with an undefined match_color and tricks stupid compiler to issue a warning and makes -Werror build to fail.

Show 12 quoted lines
>  		*eol = '\0';
>  		while (next_match(opt, bol, eol, ctx, &match, eflags)) {
>  			if (match.rm_so == match.rm_eo)
>  				break;
>
> -			output_color(opt, bol, match.rm_so, line_color);
> +			if (opt->only_matching)
> +				show_line_header(opt, name, lno, cno, sign);
> +			else
> +				output_color(opt, bol, match.rm_so, line_color);
>  			output_color(opt, bol + match.rm_so,
>  				     match.rm_eo - match.rm_so, match_color);

output_color() does check want_color(opt->color) before using its last parameter, and want_color() gives false for opt->color that is 0 (i.e. leaves match_color to be undefined), so in this case, the compiler is worried too much, but still, we should work it around if it is easy to do so.

Just initializing match_color where it is defined at the beginning of show_line() should be sufficient, I think.

Previous: Taylor BlauNext: Taylor Blau
Message 4 of 28 in “grep.c: teach --only-matching to 'git-grep(1)'”
  1. 0/2 grep.c: teach --only-matching to 'git-grep(1)'Taylor Blau, Jun 25, 2018
  2. 1/2 grep.c: extract show_line_header()Taylor Blau, Jun 25, 2018
  3. 2/2 grep.c: teach 'git grep --only-matching'Taylor Blau, Jun 25, 2018
  4. Junio C HamanoJun 27, 2018
  5. Taylor BlauJun 27, 2018
  6. Junio C HamanoJun 27, 2018
  7. Taylor BlauJun 27, 2018
  8. Jeff KingJun 28, 2018
  9. 0/2 teach --only-matching to 'git-grep(1)'Taylor Blau, Jul 2, 2018
  10. 1/2 grep.c: extract show_line_header()Taylor Blau, Jul 2, 2018
  11. 2/2 grep.c: teach 'git grep --only-matching'Taylor Blau, Jul 2, 2018
  12. Jeff KingJul 3, 2018
  13. Jeff KingJul 3, 2018
  14. Junio C HamanoJul 3, 2018
  15. 0/2 grep.c: teach --only-matching to 'git-grep(1)'Taylor Blau, Jul 3, 2018
  16. 1/2 grep.c: extract show_line_header()Taylor Blau, Jul 3, 2018
  17. 2/2 grep.c: teach 'git grep --only-matching'Taylor Blau, Jul 3, 2018
  18. grep.c: teach 'git grep --only-matching'Taylor Blau, Jul 4, 2018
  19. Taylor BlauJul 4, 2018
  20. Junio C HamanoJul 6, 2018
  21. Jeff KingJul 5, 2018
  22. Taylor BlauJul 5, 2018
  23. Junio C HamanoJul 6, 2018
  24. Taylor BlauJul 6, 2018
  25. Jeff KingJul 6, 2018
  26. Junio C HamanoJul 6, 2018
  27. grep.c: teach 'git grep --only-matching'Taylor Blau, Jul 9, 2018
  28. Taylor BlauJul 9, 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.