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
This commit is contained in:
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user