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

Re: git tries to stat //HEAD when searching for a repo, leading to huge delays on Cygwin

From
Jeff King <peff@peff.net>
Date
Nov 3, 2017, 18:29 UTC
Message-ID
<20171103182910.x7fbwodoegusyc37@sigill.intra.peff.net>
In-Reply-To
<alpine.DEB.2.21.1.1711031324110.6482@virtualbox>
On Fri, Nov 03, 2017 at 01:32:26PM +0100, Johannes Schindelin wrote:
Show 18 quoted lines
> > diff --git a/setup.c b/setup.c
> > index 27a31de33f..5d0b6a88e3 100644
> > --- a/setup.c
> > +++ b/setup.c
> > @@ -283,7 +283,9 @@ int is_git_directory(const char *suspect)
> >  	size_t len;
> >  
> >  	/* Check worktree-related signatures */
> > -	strbuf_addf(&path, "%s/HEAD", suspect);
> > +	strbuf_addstr(&path, suspect);
> > +	strbuf_complete(&path, '/');
> > +	strbuf_addstr(&path, "HEAD");
> >  	if (validate_headref(path.buf))
> >  		goto done;
> 
> Yes, that would work around the issue. TBH I expected `/` to not be a
> valid bare repository path (and therefore I thought that `suspect` could
> never be just a single slash), but people do all kinds of crazy stuff, right?

Heh. People _do_ do crazy stuff, but I think here it is just the tool double-checking if people are doing crazy stuff (which they mostly aren't) by walking up to the root.

Show 5 quoted lines
> I note also that there are tons of `strbuf_addstr(...);
> strbuf_complete(..., '/');` patterns in our code, as well as
> `strbuf("%s/blub", dir)`, which probably should all be condensed into
> single function calls both for semantic clarity as well as to avoid double
> slashes in the middle of paths.

Yeah, I had the same thought. This _seems_ like the kind of thing mkpathdup() would handle, but it doesn't (and as far as I can tell never did).

Grepping around for calls to strbuf_complete() with '/' shows that most callers wouldn't benefit. Many do trickier things like setting up a path ending in slash, and then appending the final element repeatedly while iterating over a list. Some have a strbuf already and just want to append the final element to it.

On the other hand, I suspect these are only the cases that are already conscientious about avoiding double-slashes. There are probably a ton of xstrfmt("%s/%s", dir, file) equivalents that just aren't careful.

> In the short run, though, let's take your patch. Maybe with a commit
> message like this?

Agreed. There are enough pitfalls to a general path-constructing helper that I don't think we should hold up a fix while on it.

> -- snipsnap --
> setup: avoid double slashes when looking for HEAD
I see you posted this separately, so I'll review there.

Thanks for finishing it off (I had intended to circle back to it this morning myself).

-Peff
Previous: Johannes SchindelinNext: SZEDER Gábor
Message 4 of 6 in “git tries to stat //HEAD when searching for a repo, leading to huge delays on Cygwin”
  1. Andrew BaumannNov 2, 2017
  2. Jeff KingNov 3, 2017
  3. Johannes SchindelinNov 3, 2017
  4. Jeff KingNov 3, 2017
  5. setup.c: don't try to access '//HEAD' during repo discoverySZEDER Gábor, Nov 3, 2017
  6. Johannes SchindelinNov 3, 2017

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.