diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-04-25 13:28:52 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-04-25 13:28:52 +0900 |
commit | ff6eb825f0aa1f45230c10fbb0cf8d484c927c55 (patch) | |
tree | e64f3f038b0f888c0ddc0a5c97e0d266068b82a4 /environment.c | |
parent | Merge branch 'jk/flockfile-stdio' (diff) | |
parent | refs: use chdir_notify to update cached relative paths (diff) | |
download | tgif-ff6eb825f0aa1f45230c10fbb0cf8d484c927c55.tar.xz |
Merge branch 'jk/relative-directory-fix'
Some codepaths, including the refs API, get and keep relative
paths, that go out of sync when the process does chdir(2). The
chdir-notify API is introduced to let these codepaths adjust these
cached paths to the new current directory.
* jk/relative-directory-fix:
refs: use chdir_notify to update cached relative paths
set_work_tree: use chdir_notify
add chdir-notify API
trace.c: export trace_setup_key
set_git_dir: die when setenv() fails
Diffstat (limited to 'environment.c')
-rw-r--r-- | environment.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/environment.c b/environment.c index 39b3d906c8..fd970b81bd 100644 --- a/environment.c +++ b/environment.c @@ -15,6 +15,7 @@ #include "commit.h" #include "argv-array.h" #include "object-store.h" +#include "chdir-notify.h" int trust_executable_bit = 1; int trust_ctime = 1; @@ -323,12 +324,31 @@ char *get_graft_file(void) return the_repository->graft_file; } -int set_git_dir(const char *path) +static void set_git_dir_1(const char *path) { if (setenv(GIT_DIR_ENVIRONMENT, path, 1)) - return error("Could not set GIT_DIR to '%s'", path); + die("could not set GIT_DIR to '%s'", path); setup_git_env(path); - return 0; +} + +static void update_relative_gitdir(const char *name, + const char *old_cwd, + const char *new_cwd, + void *data) +{ + char *path = reparent_relative_path(old_cwd, new_cwd, get_git_dir()); + trace_printf_key(&trace_setup_key, + "setup: move $GIT_DIR to '%s'", + path); + set_git_dir_1(path); + free(path); +} + +void set_git_dir(const char *path) +{ + set_git_dir_1(path); + if (!is_absolute_path(path)) + chdir_notify_register(NULL, update_relative_gitdir, NULL); } const char *get_log_output_encoding(void) |