|
|
|
@ -831,16 +831,6 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
@@ -831,16 +831,6 @@ static const char *setup_bare_git_dir(struct strbuf *cwd, int offset,
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const char *setup_nongit(const char *cwd, int *nongit_ok) |
|
|
|
|
{ |
|
|
|
|
if (!nongit_ok) |
|
|
|
|
die(_("not a git repository (or any of the parent directories): %s"), DEFAULT_GIT_DIR_ENVIRONMENT); |
|
|
|
|
if (chdir(cwd)) |
|
|
|
|
die_errno(_("cannot come back to cwd")); |
|
|
|
|
*nongit_ok = 1; |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_len) |
|
|
|
|
{ |
|
|
|
|
struct stat buf; |
|
|
|
@ -1054,7 +1044,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
@@ -1054,7 +1044,7 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
|
|
|
|
{ |
|
|
|
|
static struct strbuf cwd = STRBUF_INIT; |
|
|
|
|
struct strbuf dir = STRBUF_INIT, gitdir = STRBUF_INIT; |
|
|
|
|
const char *prefix; |
|
|
|
|
const char *prefix = NULL; |
|
|
|
|
struct repository_format repo_fmt; |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
@ -1079,9 +1069,6 @@ const char *setup_git_directory_gently(int *nongit_ok)
@@ -1079,9 +1069,6 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
|
|
|
|
strbuf_addbuf(&dir, &cwd); |
|
|
|
|
|
|
|
|
|
switch (setup_git_directory_gently_1(&dir, &gitdir, 1)) { |
|
|
|
|
case GIT_DIR_NONE: |
|
|
|
|
prefix = NULL; |
|
|
|
|
break; |
|
|
|
|
case GIT_DIR_EXPLICIT: |
|
|
|
|
prefix = setup_explicit_git_dir(gitdir.buf, &cwd, &repo_fmt, nongit_ok); |
|
|
|
|
break; |
|
|
|
@ -1097,29 +1084,51 @@ const char *setup_git_directory_gently(int *nongit_ok)
@@ -1097,29 +1084,51 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
|
|
|
|
prefix = setup_bare_git_dir(&cwd, dir.len, &repo_fmt, nongit_ok); |
|
|
|
|
break; |
|
|
|
|
case GIT_DIR_HIT_CEILING: |
|
|
|
|
prefix = setup_nongit(cwd.buf, nongit_ok); |
|
|
|
|
if (!nongit_ok) |
|
|
|
|
die(_("not a git repository (or any of the parent directories): %s"), |
|
|
|
|
DEFAULT_GIT_DIR_ENVIRONMENT); |
|
|
|
|
*nongit_ok = 1; |
|
|
|
|
break; |
|
|
|
|
case GIT_DIR_HIT_MOUNT_POINT: |
|
|
|
|
if (nongit_ok) { |
|
|
|
|
*nongit_ok = 1; |
|
|
|
|
strbuf_release(&cwd); |
|
|
|
|
strbuf_release(&dir); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
die(_("not a git repository (or any parent up to mount point %s)\n" |
|
|
|
|
"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."), |
|
|
|
|
dir.buf); |
|
|
|
|
if (!nongit_ok) |
|
|
|
|
die(_("not a git repository (or any parent up to mount point %s)\n" |
|
|
|
|
"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."), |
|
|
|
|
dir.buf); |
|
|
|
|
*nongit_ok = 1; |
|
|
|
|
break; |
|
|
|
|
case GIT_DIR_NONE: |
|
|
|
|
/* |
|
|
|
|
* As a safeguard against setup_git_directory_gently_1 returning |
|
|
|
|
* this value, fallthrough to BUG. Otherwise it is possible to |
|
|
|
|
* set startup_info->have_repository to 1 when we did nothing to |
|
|
|
|
* find a repository. |
|
|
|
|
*/ |
|
|
|
|
default: |
|
|
|
|
BUG("unhandled setup_git_directory_1() result"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (prefix) |
|
|
|
|
setenv(GIT_PREFIX_ENVIRONMENT, prefix, 1); |
|
|
|
|
else |
|
|
|
|
/* |
|
|
|
|
* At this point, nongit_ok is stable. If it is non-NULL and points |
|
|
|
|
* to a non-zero value, then this means that we haven't found a |
|
|
|
|
* repository and that the caller expects startup_info to reflect |
|
|
|
|
* this. |
|
|
|
|
* |
|
|
|
|
* Regardless of the state of nongit_ok, startup_info->prefix and |
|
|
|
|
* the GIT_PREFIX environment variable must always match. For details |
|
|
|
|
* see Documentation/config/alias.txt. |
|
|
|
|
*/ |
|
|
|
|
if (nongit_ok && *nongit_ok) { |
|
|
|
|
startup_info->have_repository = 0; |
|
|
|
|
startup_info->prefix = NULL; |
|
|
|
|
setenv(GIT_PREFIX_ENVIRONMENT, "", 1); |
|
|
|
|
|
|
|
|
|
startup_info->have_repository = !nongit_ok || !*nongit_ok; |
|
|
|
|
startup_info->prefix = prefix; |
|
|
|
|
} else { |
|
|
|
|
startup_info->have_repository = 1; |
|
|
|
|
startup_info->prefix = prefix; |
|
|
|
|
if (prefix) |
|
|
|
|
setenv(GIT_PREFIX_ENVIRONMENT, prefix, 1); |
|
|
|
|
else |
|
|
|
|
setenv(GIT_PREFIX_ENVIRONMENT, "", 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* 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,7 +1141,10 @@ const char *setup_git_directory_gently(int *nongit_ok)
|
|
|
|
|
* the user has set GIT_DIR. It may be beneficial to disallow bogus |
|
|
|
|
* GIT_DIR values at some point in the future. |
|
|
|
|
*/ |
|
|
|
|
if (startup_info->have_repository || getenv(GIT_DIR_ENVIRONMENT)) { |
|
|
|
|
if (/* GIT_DIR_EXPLICIT, GIT_DIR_DISCOVERED, GIT_DIR_BARE */ |
|
|
|
|
startup_info->have_repository || |
|
|
|
|
/* GIT_DIR_EXPLICIT */ |
|
|
|
|
getenv(GIT_DIR_ENVIRONMENT)) { |
|
|
|
|
if (!the_repository->gitdir) { |
|
|
|
|
const char *gitdir = getenv(GIT_DIR_ENVIRONMENT); |
|
|
|
|
if (!gitdir) |
|
|
|
|