@@ -920,8 +920,10 @@ int verify_repository_format(const struct repository_format *format,
920920void read_gitfile_error_die (int error_code , const char * path , const char * dir )
921921{
922922 switch (error_code ) {
923- case READ_GITFILE_ERR_STAT_FAILED :
924923 case READ_GITFILE_ERR_NOT_A_FILE :
924+ case READ_GITFILE_ERR_STAT_FAILED :
925+ case READ_GITFILE_ERR_MISSING :
926+ case READ_GITFILE_ERR_IS_A_DIR :
925927 /* non-fatal; follow return path */
926928 break ;
927929 case READ_GITFILE_ERR_OPEN_FAILED :
@@ -964,8 +966,14 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
964966 static struct strbuf realpath = STRBUF_INIT ;
965967
966968 if (stat (path , & st )) {
967- /* NEEDSWORK: discern between ENOENT vs other errors */
968- error_code = READ_GITFILE_ERR_STAT_FAILED ;
969+ if (errno == ENOENT || errno == ENOTDIR )
970+ error_code = READ_GITFILE_ERR_MISSING ;
971+ else
972+ error_code = READ_GITFILE_ERR_STAT_FAILED ;
973+ goto cleanup_return ;
974+ }
975+ if (S_ISDIR (st .st_mode )) {
976+ error_code = READ_GITFILE_ERR_IS_A_DIR ;
969977 goto cleanup_return ;
970978 }
971979 if (!S_ISREG (st .st_mode )) {
@@ -1601,20 +1609,37 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
16011609 if (offset > min_offset )
16021610 strbuf_addch (dir , '/' );
16031611 strbuf_addstr (dir , DEFAULT_GIT_DIR_ENVIRONMENT );
1604- gitdirenv = read_gitfile_gently (dir -> buf , die_on_error ?
1605- NULL : & error_code );
1612+ gitdirenv = read_gitfile_gently (dir -> buf , & error_code );
16061613 if (!gitdirenv ) {
1607- if (die_on_error ||
1608- error_code == READ_GITFILE_ERR_NOT_A_FILE ) {
1609- /* NEEDSWORK: fail if .git is not file nor dir */
1614+ switch (error_code ) {
1615+ case READ_GITFILE_ERR_MISSING :
1616+ /* no .git in this directory, move on */
1617+ break ;
1618+ case READ_GITFILE_ERR_IS_A_DIR :
16101619 if (is_git_directory (dir -> buf )) {
16111620 gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT ;
16121621 gitdir_path = xstrdup (dir -> buf );
16131622 }
1614- } else if (error_code != READ_GITFILE_ERR_STAT_FAILED )
1615- return GIT_DIR_INVALID_GITFILE ;
1616- } else
1623+ break ;
1624+ case READ_GITFILE_ERR_STAT_FAILED :
1625+ if (die_on_error )
1626+ die (_ ("error reading '%s'" ), dir -> buf );
1627+ else
1628+ return GIT_DIR_INVALID_GITFILE ;
1629+ case READ_GITFILE_ERR_NOT_A_FILE :
1630+ if (die_on_error )
1631+ die (_ ("not a regular file: '%s'" ), dir -> buf );
1632+ else
1633+ return GIT_DIR_INVALID_GITFILE ;
1634+ default :
1635+ if (die_on_error )
1636+ read_gitfile_error_die (error_code , dir -> buf , NULL );
1637+ else
1638+ return GIT_DIR_INVALID_GITFILE ;
1639+ }
1640+ } else {
16171641 gitfile = xstrdup (dir -> buf );
1642+ }
16181643 /*
16191644 * Earlier, we tentatively added DEFAULT_GIT_DIR_ENVIRONMENT
16201645 * to check that directory for a repository.
0 commit comments