Merge branch 'jk/relative-directory-fix'
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Apr 2018 04:28:52 +0000 (13:28 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Apr 2018 04:28:52 +0000 (13:28 +0900)
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

1  2 
Makefile
cache.h
environment.c
setup.c
t/t1501-work-tree.sh

diff --cc Makefile
Simple merge
diff --cc cache.h
Simple merge
diff --cc 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)
diff --cc setup.c
Simple merge
Simple merge