825
GIT_DIR_BARE,
826
/* these are errors */
827
GIT_DIR_HIT_CEILING = -1,
828
- GIT_DIR_HIT_MOUNT_POINT = -2
828
+ GIT_DIR_HIT_MOUNT_POINT = -2,
829
+ GIT_DIR_INVALID_GITFILE = -3
830
};
831
832
/*
843
* is relative to `dir` (i.e. *not* necessarily the cwd).
844
*/
845
static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
845
- struct strbuf *gitdir)
846
+ struct strbuf *gitdir,
847
+ int die_on_error)
848
{
849
const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT);
850
struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
892
if (one_filesystem)
893
current_device = get_device_or_die(dir->buf, NULL, 0);
894
for (;;) {
893
- int offset = dir->len;
895
+ int offset = dir->len, error_code = 0;
896
897
if (offset > min_offset)
898
strbuf_addch(dir, '/');
899
strbuf_addstr(dir, DEFAULT_GIT_DIR_ENVIRONMENT);
898
- gitdirenv = read_gitfile(dir->buf);
899
- if (!gitdirenv && is_git_directory(dir->buf))
900
- gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
900
+ gitdirenv = read_gitfile_gently(dir->buf, die_on_error ?
901
+ NULL : &error_code);
902
+ if (!gitdirenv) {
903
+ if (die_on_error ||
904
+ error_code == READ_GITFILE_ERR_NOT_A_FILE) {
905
+ if (is_git_directory(dir->buf))
906
+ gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
907
+ } else if (error_code != READ_GITFILE_ERR_STAT_FAILED)
908
+ return GIT_DIR_INVALID_GITFILE;
909
+ }
910
strbuf_setlen(dir, offset);
911
if (gitdirenv) {
912
strbuf_addstr(gitdir, gitdirenv);
943
return NULL;
944
945
cwd_len = dir.len;
937
- if (setup_git_directory_gently_1(&dir, gitdir) <= 0) {
946
+ if (setup_git_directory_gently_1(&dir, gitdir, 0) <= 0) {
947
strbuf_release(&dir);
948
return NULL;
949
}
1003
die_errno(_("Unable to read current working directory"));
1004
strbuf_addbuf(&dir, &cwd);
1005
997
- switch (setup_git_directory_gently_1(&dir, &gitdir)) {
1006
+ switch (setup_git_directory_gently_1(&dir, &gitdir, 1)) {
1007
case GIT_DIR_NONE:
1008
prefix = NULL;
1009
break;