895
void read_gitfile_error_die(int error_code, const char *path, const char *dir)
896
{
897
switch (error_code) {
898
- case READ_GITFILE_ERR_STAT_FAILED:
898
case READ_GITFILE_ERR_NOT_A_FILE:
899
+ case READ_GITFILE_ERR_STAT_FAILED:
900
+ case READ_GITFILE_ERR_MISSING:
901
+ case READ_GITFILE_ERR_IS_A_DIR:
902
/* non-fatal; follow return path */
903
break;
904
case READ_GITFILE_ERR_OPEN_FAILED:
941
static struct strbuf realpath = STRBUF_INIT;
942
943
if (stat(path, &st)) {
942
- /* NEEDSWORK: discern between ENOENT vs other errors */
943
- error_code = READ_GITFILE_ERR_STAT_FAILED;
944
+ if (errno == ENOENT || errno == ENOTDIR)
945
+ error_code = READ_GITFILE_ERR_MISSING;
946
+ else
947
+ error_code = READ_GITFILE_ERR_STAT_FAILED;
948
+ goto cleanup_return;
949
+ }
950
+ if (S_ISDIR(st.st_mode)) {
951
+ error_code = READ_GITFILE_ERR_IS_A_DIR;
952
goto cleanup_return;
953
}
954
if (!S_ISREG(st.st_mode)) {
1584
if (offset > min_offset)
1585
strbuf_addch(dir, '/');
1586
strbuf_addstr(dir, DEFAULT_GIT_DIR_ENVIRONMENT);
1579
- gitdirenv = read_gitfile_gently(dir->buf, die_on_error ?
1580
- NULL : &error_code);
1587
+ gitdirenv = read_gitfile_gently(dir->buf, &error_code);
1588
if (!gitdirenv) {
1582
- if (die_on_error ||
1583
- error_code == READ_GITFILE_ERR_NOT_A_FILE) {
1584
- /* NEEDSWORK: fail if .git is not file nor dir */
1589
+ switch (error_code) {
1590
+ case READ_GITFILE_ERR_MISSING:
1591
+ /* no .git in this directory, move on */
1592
+ break;
1593
+ case READ_GITFILE_ERR_IS_A_DIR:
1594
if (is_git_directory(dir->buf)) {
1595
gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
1596
gitdir_path = xstrdup(dir->buf);
1597
}
1589
- } else if (error_code != READ_GITFILE_ERR_STAT_FAILED)
1590
- return GIT_DIR_INVALID_GITFILE;
1591
- } else
1598
+ break;
1599
+ case READ_GITFILE_ERR_STAT_FAILED:
1600
+ if (die_on_error)
1601
+ die(_("error reading '%s'"), dir->buf);
1602
+ else
1603
+ return GIT_DIR_INVALID_GITFILE;
1604
+ case READ_GITFILE_ERR_NOT_A_FILE:
1605
+ if (die_on_error)
1606
+ die(_("not a regular file: '%s'"), dir->buf);
1607
+ else
1608
+ return GIT_DIR_INVALID_GITFILE;
1609
+ default:
1610
+ if (die_on_error)
1611
+ read_gitfile_error_die(error_code, dir->buf, NULL);
1612
+ else
1613
+ return GIT_DIR_INVALID_GITFILE;
1614
+ }
1615
+ } else {
1616
gitfile = xstrdup(dir->buf);
1617
+ }
1618
/*
1619
* Earlier, we tentatively added DEFAULT_GIT_DIR_ENVIRONMENT
1620
* to check that directory for a repository.