Merge branch 'nd/stop-setenv-work-tree' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 5 Feb 2016 22:54:07 +0000 (14:54 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Feb 2016 22:54:07 +0000 (14:54 -0800)
An earlier change in 2.5.x-era broke users' hooks and aliases by
exporting GIT_WORK_TREE to point at the root of the working tree,
interfering when they tried to use a different working tree without
setting GIT_WORK_TREE environment themselves.

* nd/stop-setenv-work-tree:
Revert "setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR"

1  2 
environment.c
t/t0002-gitfile.sh
diff --combined environment.c
index 2da7fe2e06ff38b977209d44b7404c93358430af,9daa0ba4a36ced9f63541203e7bcc2ab9e1eae56..1cc4aab4eacb629f8fe147c2e20b53c4141587aa
@@@ -24,9 -24,7 +24,9 @@@ int is_bare_repository_cfg = -1; /* uns
  int log_all_ref_updates = -1; /* unspecified */
  int warn_ambiguous_refs = 1;
  int warn_on_object_refname_ambiguity = 1;
 +int ref_paranoia = -1;
  int repository_format_version;
 +int repository_format_precious_objects;
  const char *git_commit_encoding;
  const char *git_log_output_encoding;
  int shared_repository = PERM_UMASK;
@@@ -39,7 -37,7 +39,7 @@@ int core_compression_seen
  int fsync_object_files;
  size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
  size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
 -size_t delta_base_cache_limit = 16 * 1024 * 1024;
 +size_t delta_base_cache_limit = 96 * 1024 * 1024;
  unsigned long big_file_threshold = 512 * 1024 * 1024;
  const char *pager_program;
  int pager_use_color = 1;
@@@ -48,7 -46,6 +48,7 @@@ const char *askpass_program
  const char *excludes_file;
  enum auto_crlf auto_crlf = AUTO_CRLF_FALSE;
  int check_replace_refs = 1;
 +char *git_replace_ref_base;
  enum eol core_eol = EOL_UNSET;
  enum safe_crlf safe_crlf = SAFE_CRLF_WARN;
  unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;
@@@ -82,10 -79,9 +82,10 @@@ int protect_ntfs = PROTECT_NTFS_DEFAULT
   * that is subject to stripspace.
   */
  char comment_line_char = '#';
 +int auto_comment_line_char;
  
  /* Parallel index stat data preload? */
 -int core_preload_index = 0;
 +int core_preload_index = 1;
  
  /* This is set by setup_git_dir_gently() and/or git_default_config() */
  char *git_work_tree_cfg;
@@@ -94,9 -90,8 +94,9 @@@ static char *work_tree
  static const char *namespace;
  static size_t namespace_len;
  
 -static const char *git_dir;
 +static const char *git_dir, *git_common_dir;
  static char *git_object_dir, *git_index_file, *git_graft_file;
 +int git_db_env, git_index_env, git_graft_env, git_common_dir_env;
  
  /*
   * Repository-local GIT_* environment variables; see cache.h for details.
@@@ -112,10 -107,8 +112,10 @@@ const char * const local_repo_env[] = 
        GRAFT_ENVIRONMENT,
        INDEX_ENVIRONMENT,
        NO_REPLACE_OBJECTS_ENVIRONMENT,
 +      GIT_REPLACE_REF_BASE_ENVIRONMENT,
        GIT_PREFIX_ENVIRONMENT,
        GIT_SHALLOW_FILE_ENVIRONMENT,
 +      GIT_COMMON_DIR_ENVIRONMENT,
        NULL
  };
  
@@@ -140,43 -133,31 +140,43 @@@ static char *expand_namespace(const cha
        return strbuf_detach(&buf, NULL);
  }
  
 +static char *git_path_from_env(const char *envvar, const char *git_dir,
 +                             const char *path, int *fromenv)
 +{
 +      const char *value = getenv(envvar);
 +      if (!value)
 +              return xstrfmt("%s/%s", git_dir, path);
 +      if (fromenv)
 +              *fromenv = 1;
 +      return xstrdup(value);
 +}
 +
  static void setup_git_env(void)
  {
 +      struct strbuf sb = STRBUF_INIT;
        const char *gitfile;
        const char *shallow_file;
 +      const char *replace_ref_base;
  
        git_dir = getenv(GIT_DIR_ENVIRONMENT);
        if (!git_dir)
                git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
        gitfile = read_gitfile(git_dir);
        git_dir = xstrdup(gitfile ? gitfile : git_dir);
 -      git_object_dir = getenv(DB_ENVIRONMENT);
 -      if (!git_object_dir) {
 -              git_object_dir = xmalloc(strlen(git_dir) + 9);
 -              sprintf(git_object_dir, "%s/objects", git_dir);
 -      }
 -      git_index_file = getenv(INDEX_ENVIRONMENT);
 -      if (!git_index_file) {
 -              git_index_file = xmalloc(strlen(git_dir) + 7);
 -              sprintf(git_index_file, "%s/index", git_dir);
 -      }
 -      git_graft_file = getenv(GRAFT_ENVIRONMENT);
 -      if (!git_graft_file)
 -              git_graft_file = git_pathdup("info/grafts");
 +      if (get_common_dir(&sb, git_dir))
 +              git_common_dir_env = 1;
 +      git_common_dir = strbuf_detach(&sb, NULL);
 +      git_object_dir = git_path_from_env(DB_ENVIRONMENT, git_common_dir,
 +                                         "objects", &git_db_env);
 +      git_index_file = git_path_from_env(INDEX_ENVIRONMENT, git_dir,
 +                                         "index", &git_index_env);
 +      git_graft_file = git_path_from_env(GRAFT_ENVIRONMENT, git_common_dir,
 +                                         "info/grafts", &git_graft_env);
        if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
                check_replace_refs = 0;
 +      replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
 +      git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
 +                                                        : "refs/replace/");
        namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
        namespace_len = strlen(namespace);
        shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
@@@ -197,11 -178,6 +197,11 @@@ const char *get_git_dir(void
        return git_dir;
  }
  
 +const char *get_git_common_dir(void)
 +{
 +      return git_common_dir;
 +}
 +
  const char *get_git_namespace(void)
  {
        if (!namespace)
@@@ -235,8 -211,6 +235,6 @@@ void set_git_work_tree(const char *new_
        }
        git_work_tree_initialized = 1;
        work_tree = xstrdup(real_path(new_work_tree));
-       if (setenv(GIT_WORK_TREE_ENVIRONMENT, work_tree, 1))
-               die("could not set GIT_WORK_TREE to '%s'", work_tree);
  }
  
  const char *get_git_work_tree(void)
diff --combined t/t0002-gitfile.sh
index 9670e8cbe6cb9a9faa3519b0f11dc16713496188,3eb1127d4b66dff72a9dda5ec52771f5cec4af8d..3afe0125c99f037b9f144806c00435dcba3f93ea
@@@ -99,7 -99,7 +99,7 @@@ test_expect_success 'check rev-list' 
        test "$SHA" = "$(git rev-list HEAD)"
  '
  
- test_expect_success 'setup_git_dir twice in subdir' '
+ test_expect_failure 'setup_git_dir twice in subdir' '
        git init sgd &&
        (
                cd sgd &&
        )
  '
  
 +test_expect_success 'enter_repo non-strict mode' '
 +      test_create_repo enter_repo &&
 +      (
 +              cd enter_repo &&
 +              test_tick &&
 +              test_commit foo &&
 +              mv .git .realgit &&
 +              echo "gitdir: .realgit" >.git
 +      ) &&
 +      git ls-remote enter_repo >actual &&
 +      cat >expected <<-\EOF &&
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 +      EOF
 +      test_cmp expected actual
 +'
 +
 +test_expect_success 'enter_repo linked checkout' '
 +      (
 +              cd enter_repo &&
 +              git worktree add  ../foo refs/tags/foo
 +      ) &&
 +      git ls-remote foo >actual &&
 +      cat >expected <<-\EOF &&
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 +      EOF
 +      test_cmp expected actual
 +'
 +
 +test_expect_success 'enter_repo strict mode' '
 +      git ls-remote --upload-pack="git upload-pack --strict" foo/.git >actual &&
 +      cat >expected <<-\EOF &&
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        HEAD
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/heads/master
 +      946e985ab20de757ca5b872b16d64e92ff3803a9        refs/tags/foo
 +      EOF
 +      test_cmp expected actual
 +'
 +
  test_done