From: Junio C Hamano Date: Wed, 25 Apr 2018 04:28:52 +0000 (+0900) Subject: Merge branch 'jk/relative-directory-fix' X-Git-Tag: v2.18.0-rc0~128 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/ff6eb825f0aa1f45230c10fbb0cf8d484c927c55 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 --- ff6eb825f0aa1f45230c10fbb0cf8d484c927c55 diff --cc environment.c index 39b3d906c8,903a6c9df7..fd970b81bd --- a/environment.c +++ b/environment.c @@@ -13,8 -13,7 +13,9 @@@ #include "refs.h" #include "fmt-merge-msg.h" #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 -297,32 +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); - repo_set_gitdir(the_repository, path); - setup_git_env(); + 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)