|
|
|
@ -624,22 +624,32 @@ static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_
@@ -624,22 +624,32 @@ static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_
|
|
|
|
|
/* |
|
|
|
|
* A "string_list_each_func_t" function that canonicalizes an entry |
|
|
|
|
* from GIT_CEILING_DIRECTORIES using real_path_if_valid(), or |
|
|
|
|
* discards it if unusable. |
|
|
|
|
* discards it if unusable. The presence of an empty entry in |
|
|
|
|
* GIT_CEILING_DIRECTORIES turns off canonicalization for all |
|
|
|
|
* subsequent entries. |
|
|
|
|
*/ |
|
|
|
|
static int canonicalize_ceiling_entry(struct string_list_item *item, |
|
|
|
|
void *unused) |
|
|
|
|
void *cb_data) |
|
|
|
|
{ |
|
|
|
|
int *empty_entry_found = cb_data; |
|
|
|
|
char *ceil = item->string; |
|
|
|
|
const char *real_path; |
|
|
|
|
|
|
|
|
|
if (!*ceil || !is_absolute_path(ceil)) |
|
|
|
|
if (!*ceil) { |
|
|
|
|
*empty_entry_found = 1; |
|
|
|
|
return 0; |
|
|
|
|
real_path = real_path_if_valid(ceil); |
|
|
|
|
if (!real_path) |
|
|
|
|
} else if (!is_absolute_path(ceil)) { |
|
|
|
|
return 0; |
|
|
|
|
free(item->string); |
|
|
|
|
item->string = xstrdup(real_path); |
|
|
|
|
return 1; |
|
|
|
|
} else if (*empty_entry_found) { |
|
|
|
|
/* Keep entry but do not canonicalize it */ |
|
|
|
|
return 1; |
|
|
|
|
} else { |
|
|
|
|
const char *real_path = real_path_if_valid(ceil); |
|
|
|
|
if (!real_path) |
|
|
|
|
return 0; |
|
|
|
|
free(item->string); |
|
|
|
|
item->string = xstrdup(real_path); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
@ -679,9 +689,11 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
@@ -679,9 +689,11 @@ static const char *setup_git_directory_gently_1(int *nongit_ok)
|
|
|
|
|
return setup_explicit_git_dir(gitdirenv, cwd, len, nongit_ok); |
|
|
|
|
|
|
|
|
|
if (env_ceiling_dirs) { |
|
|
|
|
int empty_entry_found = 0; |
|
|
|
|
|
|
|
|
|
string_list_split(&ceiling_dirs, env_ceiling_dirs, PATH_SEP, -1); |
|
|
|
|
filter_string_list(&ceiling_dirs, 0, |
|
|
|
|
canonicalize_ceiling_entry, NULL); |
|
|
|
|
canonicalize_ceiling_entry, &empty_entry_found); |
|
|
|
|
ceil_offset = longest_ancestor_length(cwd, &ceiling_dirs); |
|
|
|
|
string_list_clear(&ceiling_dirs, 0); |
|
|
|
|
} |
|
|
|
|