Merge branch 'nd/export-worktree'
authorJunio C Hamano <gitster@pobox.com>
Mon, 3 Aug 2015 18:01:14 +0000 (11:01 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Aug 2015 18:01:14 +0000 (11:01 -0700)
Running an aliased command from a subdirectory when the .git thing
in the working tree is a gitfile pointing elsewhere did not work.

* nd/export-worktree:
setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR

1  2 
environment.c
diff --combined environment.c
index 01cb28dda922a3ce36836d19d30467381c561f51,36fbba57fc83afd36d99bf5d4f3a1fc3feefba09..a533aed630c20a5e0718bcea4375875a44896416
@@@ -24,7 -24,6 +24,7 @@@ 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;
  const char *git_commit_encoding;
  const char *git_log_output_encoding;
@@@ -38,7 -37,7 +38,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;
@@@ -47,7 -46,6 +47,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;
@@@ -81,10 -79,9 +81,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;
@@@ -93,9 -90,8 +93,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.
@@@ -111,10 -107,8 +111,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
  };
  
@@@ -139,46 -133,31 +139,46 @@@ 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) {
 +              char *buf = xmalloc(strlen(git_dir) + strlen(path) + 2);
 +              sprintf(buf, "%s/%s", git_dir, path);
 +              return buf;
 +      }
 +      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);
@@@ -199,11 -178,6 +199,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)
@@@ -237,6 -211,8 +237,8 @@@ 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)