git init will die with an error message before doing anything if the value of GIT_WORK_TREE is no valid directory. GIT_WORK_TREE is also expanded to an absolute path for the config file. Signed-off-by: Matthias Lederhofer <matled@xxxxxxx> --- builtin-init-db.c | 31 ++++++++++++++++++++++++++++++- t/t1501-worktree.sh | 15 +++++++++++++++ 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/builtin-init-db.c b/builtin-init-db.c index 4df9fd0..4ea8c1f 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -182,6 +182,7 @@ static int create_default_files(const char *git_dir, const char *template_path) char repo_version_string[10]; int reinit; int filemode; + const char *git_work_tree = getenv(GIT_WORKING_TREE_ENVIRONMENT); if (len > sizeof(path)-50) die("insane git directory %s", git_dir); @@ -252,7 +253,7 @@ static int create_default_files(const char *git_dir, const char *template_path) } git_config_set("core.filemode", filemode ? "true" : "false"); - if (is_bare_repository()) { + if (is_bare_repository() && !git_work_tree) { git_config_set("core.bare", "true"); } else { @@ -260,6 +261,8 @@ static int create_default_files(const char *git_dir, const char *template_path) /* allow template config file to override the default */ if (log_all_ref_updates == -1) git_config_set("core.logallrefupdates", "true"); + if (git_work_tree) + git_config_set("core.worktree", git_work_tree); } return reinit; } @@ -276,6 +279,7 @@ static const char init_db_usage[] = int cmd_init_db(int argc, const char **argv, const char *prefix) { const char *git_dir; + const char *git_work_tree; const char *sha1_dir; const char *template_dir = NULL; char *path; @@ -294,6 +298,31 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) } /* + * check value of $GIT_WORK_TREE + * if it is set it has to be a valid directory + */ + git_work_tree = getenv(GIT_WORKING_TREE_ENVIRONMENT); + if (git_work_tree) { + char cwd[PATH_MAX]; + + if (!getcwd(cwd, sizeof(cwd)) || cwd[0] != '/') + die("Unable to read current working directory"); + if (chdir(git_work_tree)) + die("chdir to specified working tree '%s' failed", + git_work_tree); + /* get absolute path */ + if (git_work_tree[0] != '/') { + char worktree[PATH_MAX]; + if (!getcwd(worktree, sizeof(worktree)) || + worktree[0] != '/') + die("Unable to read current working directory"); + setenv(GIT_WORKING_TREE_ENVIRONMENT, worktree, 1); + } + if (chdir(cwd)) + die("Cannot come back to cwd"); + } + + /* * Set up the default .git directory contents */ git_dir = getenv(GIT_DIR_ENVIRONMENT); diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh index bc08994..4db4b6a 100755 --- a/t/t1501-worktree.sh +++ b/t/t1501-worktree.sh @@ -88,4 +88,19 @@ test_expect_success 'repository/worktree: --is-bare-repository' \ test_expect_success 'repository/worktree: --is-inside-git-dir' \ 'test "false" = "$(git rev-parse --is-inside-git-dir)"' +# git init +cd "$top" || exit 1 +export GIT_DIR=$(pwd)/repository2 +test_expect_failure 'git --work-tree non-existent init' \ + 'git --work-tree non-existent init' +test_expect_success 'git --work-tree working/tree init' \ + 'git --work-tree working/tree init' +test_expect_success 'config knows core.worktree' \ + 'git config core.worktree' +git config --unset core.worktree || exit 1 +test_expect_success 'git --work-tree `pwd`/working init' \ + 'git --work-tree "$(pwd)"/working init' +test_expect_success 'config knows core.worktree' \ + 'git config core.worktree' + test_done -- 1.5.0.4.414.g32da9 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html