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
Taylor Blau <me@ttaylorr.com>
Date
Jun 27, 2018, 17:16 UTC
Message-ID
<20180627171657.GA26628@syl.attlocal.net>
In-Reply-To
<xmqqsh58gp3p.fsf@gitster-ct.c.googlers.com>
On Wed, Jun 27, 2018 at 09:40:10AM -0700, Junio C Hamano wrote:
Show 30 quoted lines
> Taylor Blau <me@ttaylorr.com> writes:
>
> > -		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.

Right, this is because we are using the `while (next_match(...))` loop for non-colorized output, which is new. This seems like a definite problem, and certainly causes the -Werror build to fail for me, too.

Show 21 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.

I think that we could also use the following, and leave the `if (opt->color)` conditional where it is:

diff --git a/grep.c b/grep.c
index 48cca6723e..b985fb3ee0 100644
--- a/grep.c
+++ b/grep.c
@@ -1448,7 +1448,7 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
 		      const char *name, unsigned lno, ssize_t cno, char sign)
 {
 	int rest = eol - bol;
-	const char *match_color, *line_color = NULL;
+	const char *match_color = NULL, *line_color = NULL;

 	if (opt->file_break && opt->last_shown == 0) {
 		if (opt->show_hunk_mark)

From my reading, output_color() appears happy to treat a NULL color as
meaningless, and instead redirect the call to `opt->output` without the
preceding colorization and the reset afterwords.

We could also move that `if (opt->color)` block up closer to where
line_color and match_color are initialized, which might appear cleaner.
I think the best time to do that would be in a preparatory patch in this
series.

What do you think?


Thanks,
Taylor
Previous: Junio C HamanoNext: Junio C Hamano
Message 5 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.