All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthias Lederhofer <matled@gmx.net>
To: Junio C Hamano <junkio@cox.net>, git@vger.kernel.org
Subject: [PATCH 5/5] git-init: set core.worktree when GIT_WORK_TREE is specified
Date: Sat, 17 Mar 2007 15:45:31 +0100	[thread overview]
Message-ID: <20070317144531.GE26290@moooo.ath.cx> (raw)
In-Reply-To: <20070317143452.GA21140@moooo.ath.cx>

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@gmx.net>
---
 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

  parent reply	other threads:[~2007-03-17 14:45 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-03-17  1:58 [PATCH] git-init: set core.workdir when GIT_WORK_DIR is specified Matthias Lederhofer
2007-03-17  7:29 ` Junio C Hamano
2007-03-17 11:01   ` Matthias Lederhofer
2007-03-17 14:34   ` Matthias Lederhofer
2007-03-17 14:42     ` [PATCH 1/5] rev-parse: --is-bare-repository option Matthias Lederhofer
2007-03-17 14:43     ` [PATCH 2/5] test git-rev-parse Matthias Lederhofer
2007-03-27 22:07       ` [PATCH(amend)] " Matthias Lederhofer
2007-03-17 14:44     ` [PATCH 3/5] introduce GIT_WORK_TREE environment variable Matthias Lederhofer
2007-03-18 19:43       ` Matthias Lederhofer
2007-03-18 20:12       ` Matthias Lederhofer
2007-03-18 20:23         ` Matthias Lederhofer
2007-03-18 20:28           ` Junio C Hamano
2007-03-17 14:44     ` [PATCH 4/5] test GIT_WORK_TREE Matthias Lederhofer
2007-03-17 14:45     ` Matthias Lederhofer [this message]
2007-03-18  8:47     ` [PATCH] git-init: set core.workdir when GIT_WORK_DIR is specified Junio C Hamano
2007-03-18 11:18       ` Matthias Lederhofer
2007-03-18 21:18       ` Matthias Lederhofer
     [not found]         ` <7vk5xensjn.fsf@assigned-by-dhcp.cox.net>
2007-03-19 14:24           ` Johannes Schindelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070317144531.GE26290@moooo.ath.cx \
    --to=matled@gmx.net \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.