@@ -831,16 +831,6 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
831
831
return NULL ;
832
832
}
833
833
834
- static const char * setup_nongit (const char * cwd , int * nongit_ok )
835
- {
836
- if (!nongit_ok )
837
- die (_ ("not a git repository (or any of the parent directories): %s" ), DEFAULT_GIT_DIR_ENVIRONMENT );
838
- if (chdir (cwd ))
839
- die_errno (_ ("cannot come back to cwd" ));
840
- * nongit_ok = 1 ;
841
- return NULL ;
842
- }
843
-
844
834
static dev_t get_device_or_die (const char * path , const char * prefix , int prefix_len )
845
835
{
846
836
struct stat buf ;
@@ -1054,7 +1044,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
1054
1044
{
1055
1045
static struct strbuf cwd = STRBUF_INIT ;
1056
1046
struct strbuf dir = STRBUF_INIT , gitdir = STRBUF_INIT ;
1057
- const char * prefix ;
1047
+ const char * prefix = NULL ;
1058
1048
struct repository_format repo_fmt ;
1059
1049
1060
1050
/*
@@ -1079,9 +1069,6 @@ const char *setup_git_directory_gently(int *nongit_ok)
1079
1069
strbuf_addbuf (& dir , & cwd );
1080
1070
1081
1071
switch (setup_git_directory_gently_1 (& dir , & gitdir , 1 )) {
1082
- case GIT_DIR_NONE :
1083
- prefix = NULL ;
1084
- break ;
1085
1072
case GIT_DIR_EXPLICIT :
1086
1073
prefix = setup_explicit_git_dir (gitdir .buf , & cwd , & repo_fmt , nongit_ok );
1087
1074
break ;
@@ -1097,29 +1084,51 @@ const char *setup_git_directory_gently(int *nongit_ok)
1097
1084
prefix = setup_bare_git_dir (& cwd , dir .len , & repo_fmt , nongit_ok );
1098
1085
break ;
1099
1086
case GIT_DIR_HIT_CEILING :
1100
- prefix = setup_nongit (cwd .buf , nongit_ok );
1087
+ if (!nongit_ok )
1088
+ die (_ ("not a git repository (or any of the parent directories): %s" ),
1089
+ DEFAULT_GIT_DIR_ENVIRONMENT );
1090
+ * nongit_ok = 1 ;
1101
1091
break ;
1102
1092
case GIT_DIR_HIT_MOUNT_POINT :
1103
- if (nongit_ok ) {
1104
- * nongit_ok = 1 ;
1105
- strbuf_release (& cwd );
1106
- strbuf_release (& dir );
1107
- return NULL ;
1108
- }
1109
- die (_ ("not a git repository (or any parent up to mount point %s)\n"
1110
- "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." ),
1111
- dir .buf );
1093
+ if (!nongit_ok )
1094
+ die (_ ("not a git repository (or any parent up to mount point %s)\n"
1095
+ "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)." ),
1096
+ dir .buf );
1097
+ * nongit_ok = 1 ;
1098
+ break ;
1099
+ case GIT_DIR_NONE :
1100
+ /*
1101
+ * As a safeguard against setup_git_directory_gently_1 returning
1102
+ * this value, fallthrough to BUG. Otherwise it is possible to
1103
+ * set startup_info->have_repository to 1 when we did nothing to
1104
+ * find a repository.
1105
+ */
1112
1106
default :
1113
1107
BUG ("unhandled setup_git_directory_1() result" );
1114
1108
}
1115
1109
1116
- if (prefix )
1117
- setenv (GIT_PREFIX_ENVIRONMENT , prefix , 1 );
1118
- else
1110
+ /*
1111
+ * At this point, nongit_ok is stable. If it is non-NULL and points
1112
+ * to a non-zero value, then this means that we haven't found a
1113
+ * repository and that the caller expects startup_info to reflect
1114
+ * this.
1115
+ *
1116
+ * Regardless of the state of nongit_ok, startup_info->prefix and
1117
+ * the GIT_PREFIX environment variable must always match. For details
1118
+ * see Documentation/config/alias.txt.
1119
+ */
1120
+ if (nongit_ok && * nongit_ok ) {
1121
+ startup_info -> have_repository = 0 ;
1122
+ startup_info -> prefix = NULL ;
1119
1123
setenv (GIT_PREFIX_ENVIRONMENT , "" , 1 );
1120
-
1121
- startup_info -> have_repository = !nongit_ok || !* nongit_ok ;
1122
- startup_info -> prefix = prefix ;
1124
+ } else {
1125
+ startup_info -> have_repository = 1 ;
1126
+ startup_info -> prefix = prefix ;
1127
+ if (prefix )
1128
+ setenv (GIT_PREFIX_ENVIRONMENT , prefix , 1 );
1129
+ else
1130
+ setenv (GIT_PREFIX_ENVIRONMENT , "" , 1 );
1131
+ }
1123
1132
1124
1133
/*
1125
1134
* Not all paths through the setup code will call 'set_git_dir()' (which
@@ -1132,7 +1141,10 @@ const char *setup_git_directory_gently(int *nongit_ok)
1132
1141
* the user has set GIT_DIR. It may be beneficial to disallow bogus
1133
1142
* GIT_DIR values at some point in the future.
1134
1143
*/
1135
- if (startup_info -> have_repository || getenv (GIT_DIR_ENVIRONMENT )) {
1144
+ if (/* GIT_DIR_EXPLICIT, GIT_DIR_DISCOVERED, GIT_DIR_BARE */
1145
+ startup_info -> have_repository ||
1146
+ /* GIT_DIR_EXPLICIT */
1147
+ getenv (GIT_DIR_ENVIRONMENT )) {
1136
1148
if (!the_repository -> gitdir ) {
1137
1149
const char * gitdir = getenv (GIT_DIR_ENVIRONMENT );
1138
1150
if (!gitdir )
0 commit comments