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

Re: [RFC/PATCH] Fix path prefixing in grep_object

From
Jeff King <peff@peff.net>
Date
Aug 25, 2013, 04:41 UTC
Message-ID
<20130825044108.GA21300@sigill.intra.peff.net>
In-Reply-To
<1377394558-371-1-git-send-email-hordp@cisco.com>
On Sat, Aug 24, 2013 at 09:35:58PM -0400, Phil Hord wrote:
Show 7 quoted lines
> When the pathspec given to grep includes a tree name, the full
> name of matched files is assembled using colon as a separator.
> If the pathspec includes a tree name, it should use a slash
> instead.
> 
> Check if the pathspec already names a tree and ref (including
> a colon) and use a slash if so.
Makes sense.
> I'm not sure about the detection I used here.  It works, but it is
> not terribly robust.  Is there a better way to handle this?  Maybe
> something like 'prefix_pathspec(name,"");'.

I think the information you want has been thrown away by the time we get to grep_object. Only get_sha1 knows whether the name was really a direct tree reference or if it had to traverse paths.

So we are necessarily reconstructing based on what we know of the syntax. And I think that your rule is OK, because we know that refnames cannot contain a colon. So even though pathnames can, we do not have to care; we only want to know "is there a path in the name", and if we have at least one colon, the answer is yes.

>  builtin/grep.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)

A test would be nice. Both to make sure we do not re-break it, and because it helps demonstrate the problem very easily (it took me a minute to figure out what was going on from your description).

Show 12 quoted lines
> diff --git a/builtin/grep.c b/builtin/grep.c
> index 03bc442..d0deae4 100644
> --- a/builtin/grep.c
> +++ b/builtin/grep.c
> @@ -480,8 +480,9 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
>  		len = name ? strlen(name) : 0;
>  		strbuf_init(&base, PATH_MAX + len + 1);
>  		if (len) {
> +			int has_colon = !!strchr(name,':');
>  			strbuf_add(&base, name, len);
> -			strbuf_addch(&base, ':');
> +			strbuf_addch(&base, has_colon?'/':':');

Please use whitespace with your ternary operator. The '/':':' made me think I was reading Perl for a minute. :)

-Peff
Previous: Phil HordNext: Jonathan Nieder
Message 17 of 19 in “Fix path prefixing in grep_object”
  1. Fix path prefixing in grep_objectPhil Hord, Aug 25, 2013
  2. Phil HordAug 25, 2013
  3. Junio C HamanoAug 25, 2013
  4. Jonathan NiederAug 25, 2013
  5. Junio C HamanoAug 25, 2013
  6. Junio C HamanoAug 26, 2013
  7. Phil HordAug 26, 2013
  8. Junio C HamanoAug 26, 2013
  9. Phil HordAug 26, 2013
  10. Phil HordAug 26, 2013
  11. Junio C HamanoAug 26, 2013
  12. Phil HordAug 26, 2013
  13. Junio C HamanoAug 27, 2013
  14. Phil HordAug 27, 2013
  15. Junio C HamanoAug 26, 2013
  16. Phil HordAug 26, 2013
  17. Jeff KingAug 25, 2013
  18. Jonathan NiederAug 25, 2013
  19. Jeff KingAug 25, 2013

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.