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

Re: [PATCH v5 2/2] setup: allow cwd/.git to be a symlink to a directory

From
Tian Yuchen <a3205153416@gmail.com>
Date
Feb 19, 2026, 05:11 UTC
Message-ID
<e370cace-1a43-444a-a3d1-5ea35dd22e60@gmail.com>
In-Reply-To
<xmqqtsvd7vu6.fsf@gitster.g>
On 2/19/26 02:25, Junio C Hamano wrote:
Show 58 quoted lines
> Tian Yuchen <a3205153416@gmail.com> writes:
> 
>> Strictly enforcing 'lstat()' prevents valid '.git' symlinks.
> 
> But nobody sane would propose running one more lstat() anyway, so
> how is that relevant?
> 
>>   		if (!gitdirenv) {
>> -			if (die_on_error ||
>> -			    error_code == READ_GITFILE_ERR_NOT_A_FILE) {
>> -				/* NEEDSWORK: fail if .git is not file nor dir */
>> -				if (is_git_directory(dir->buf)) {
>> -					gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
>> -					gitdir_path = xstrdup(dir->buf);
>> -				}
>> -			} else if (error_code != READ_GITFILE_ERR_STAT_FAILED)
>> -				return GIT_DIR_INVALID_GITFILE;
> 
> The _intent_ of the original code was to
> 
>      * do is_git_directory() thing to deal with a plain vanilla
>        ".git" directory when read_gitfile_gently thing said "we found
>        a directory" (NOT_A_FILE is overly coarse, which is what we
>        are correcting in this topic, but the _intent_ was to do the
>        is_git_directory() thing when we know it is a directory).
> 
>      * return INVALID_GITFILE on any error, but do not return when
>        the reason why read_gitfile_gently thing failed was because
>        there is no ".git" there (again, STAT_FAILED is overly coarse,
>        which is what we are correcting in this topic, but the
>        _intent_ was to return INVALID thing when we not the failure
>        is not due to ENOENT).  Note that returning INVALID_GITFILE is
>        done when die_on_error is not set.
> 
>> -		} else
>> +			if (error_code)
>> +				read_gitfile_error_die(error_code, dir->buf, NULL);
> 
> Should this be unconditional?  If our caller did not ask us to die
> upon an error with die_on_error, what happens?  The original I think
> returned INVALID_GITFILE for the caller to deal with.
> 
>> +			if (is_git_directory(dir->buf)) {
> 
> Should this be unconditional?  If the thing is a directory, the
> original would have given us NOT_A_FILE but now it would give us
> IS_A_DIR.  And that is the only case original wanted to call
> is_git_directory() no?
> 
>> +				gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
>> +				gitdir_path = xstrdup(dir->buf);
>> +			}
>> +		} else {
>>   			gitfile = xstrdup(dir->buf);
>> +		}
>>   		/*
>>   		 * Earlier, we tentatively added DEFAULT_GIT_DIR_ENVIRONMENT
>>   		 * to check that directory for a repository.
Thanks for the review.
I have already sent out v6 yesterday. Here is the link:
https://lore.kernel.org/git/20260218124638.176936-1-a3205153416@gmail.com/

Based on your feedback and the changes that have been made on v6, it seems that the tasks that need to be completed are as follows:

  - Conditional 'is_git_directory' check: restrict the 
'is_git_directory()' check to only run when we explicitly get 
'READ_GITFILE_ERR_IS_A_DIR'. It makes no sense to check it for other 
error types.
  - Squash two patches into one single commit, as you suggested. 
(Actually, I'm a bit confused—are you saying to “make both patches 
standalone executable” or to “merge the two patches directly”? Either 
way, I'll go ahead and send the v7 patches first.)
  - Rephrase the commit message to describe the lstat() limitation, 
rather than saying 'we switch to stat()'

The holiday is over, and my efficiency in sending patches and replying to emails may be somewhat reduced. Please bear with me.

Regards,
Yuchen
Previous: Junio C HamanoNext: Tian Yuchen
Message 31 of 35 in “[RFC] setup: fail if .git is not a file or directory”
  1. Tian YuchenFeb 11, 2026
  2. Junio C HamanoFeb 11, 2026
  3. Tian YuchenFeb 12, 2026
  4. setup: fail if .git is not a file or directoryTian Yuchen, Feb 12, 2026
  5. Junio C HamanoFeb 12, 2026
  6. Tian YuchenFeb 13, 2026
  7. setup: fail if .git is not a file or directoryTian Yuchen, Feb 14, 2026
  8. Junio C HamanoFeb 15, 2026
  9. Tian YuchenFeb 15, 2026
  10. Junio C HamanoFeb 16, 2026
  11. Tian YuchenFeb 16, 2026
  12. setup: allow cwd/.git to be a symlink to a directoryTian Yuchen, Feb 17, 2026
  13. Karthik NayakFeb 17, 2026
  14. Tian YuchenFeb 17, 2026
  15. Karthik NayakFeb 17, 2026
  16. Junio C HamanoFeb 17, 2026
  17. Junio C HamanoFeb 17, 2026
  18. Karthik NayakFeb 17, 2026
  19. Tian YuchenFeb 18, 2026
  20. Karthik NayakFeb 17, 2026
  21. 0/2 setup.c: v5 rerollTian Yuchen, Feb 18, 2026
  22. 1/2 setup: distingush ENOENT from other stat errorsTian Yuchen, Feb 18, 2026
  23. Karthik NayakFeb 18, 2026
  24. Tian YuchenFeb 18, 2026
  25. Junio C HamanoFeb 18, 2026
  26. Junio C HamanoFeb 18, 2026
  27. 2/2 setup: allow cwd/.git to be a symlink to a directoryTian Yuchen, Feb 18, 2026
  28. Karthik NayakFeb 18, 2026
  29. Tian YuchenFeb 18, 2026
  30. Junio C HamanoFeb 18, 2026
  31. Tian YuchenFeb 19, 2026
  32. Tian YuchenFeb 15, 2026
  33. brian m. carlsonFeb 12, 2026
  34. Junio C HamanoFeb 12, 2026
  35. brian m. carlsonFeb 12, 2026

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.