git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwd

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Dec 26, 2010, 11:46 UTC
Message-ID
<1293364014-8463-1-git-send-email-pclouds@gmail.com>
In-Reply-To
<1293285457-11915-2-git-send-email-pclouds@gmail.com>

When setup_work_tree() is called, it moves cwd to $GIT_WORK_TREE and makes internal copy of $GIT_WORK_TREE absolute. The environt variable, if set by user, remains unchanged. If the variable is relative, it is no longer correct because its base dir has changed.

Instead of making $GIT_WORK_TREE absolute too, we just say "." and let subsequent git processes handle it.

Reported-by: Michel Briand <michelbriand@free.fr>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 This one is better, on top of master because the next one is on top
 of nd/setup.
 And I forgot to tell why I did not put the fault in real life [1]
 into tests: I don't like git-merge spawning another process just for
 resetting worktree. Sooner or later it should be replaced to use
 unpack_trees() directly. When that happens, the test would become
 invalid.
 [1] http://thread.gmane.org/gmane.comp.version-control.git/164066/focus=164171
 .gitignore          |    1 +
 Makefile            |    1 +
 setup.c             |    8 ++++++++
 t/t1501-worktree.sh |   11 +++++++++++
 test-subprocess.c   |   21 +++++++++++++++++++++
 5 files changed, 42 insertions(+), 0 deletions(-)
 create mode 100644 test-subprocess.c
diff --git a/.gitignore b/.gitignore
index 87b833c..3dd6ef7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -177,6 +177,7 @@
 /test-sha1
 /test-sigchain
 /test-string-pool
+/test-subprocess
 /test-svn-fe
 /test-treap
 /common-cmds.h
diff --git a/Makefile b/Makefile
index 57d9c65..bdf86a3 100644
--- a/Makefile
+++ b/Makefile
@@ -431,6 +431,7 @@ TEST_PROGRAMS_NEED_X += test-run-command
 TEST_PROGRAMS_NEED_X += test-sha1
 TEST_PROGRAMS_NEED_X += test-sigchain
 TEST_PROGRAMS_NEED_X += test-string-pool
+TEST_PROGRAMS_NEED_X += test-subprocess
 TEST_PROGRAMS_NEED_X += test-svn-fe
 TEST_PROGRAMS_NEED_X += test-treap
 TEST_PROGRAMS_NEED_X += test-index-version
diff --git a/setup.c b/setup.c
index 91887a4..3833569 100644
--- a/setup.c
+++ b/setup.c
@@ -239,6 +239,14 @@ void setup_work_tree(void)
 		git_dir = make_absolute_path(git_dir);
 	if (!work_tree || chdir(work_tree))
 		die("This operation must be run in a work tree");
+
+	/*
+	 * Make sure subsequent git processes find correct worktree
+	 * if $GIT_WORK_TREE is set relative
+	 */
+	if (getenv(GIT_WORK_TREE_ENVIRONMENT))
+		setenv(GIT_WORK_TREE_ENVIRONMENT, ".", 1);
+
 	set_git_dir(make_relative_path(git_dir, work_tree));
 	initialized = 1;
 }
diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
index 2c8f01f..1f3b50d 100755
--- a/t/t1501-worktree.sh
+++ b/t/t1501-worktree.sh
@@ -340,4 +340,15 @@ test_expect_success 'make_relative_path handles double slashes in GIT_DIR' '
 	git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file
 '
 
+test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' '
+	(
+	GIT_DIR=repo.git &&
+	GIT_WORK_TREE=repo.git/work &&
+	export GIT_DIR GIT_WORK_TREE &&
+	test-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&
+	echo "`pwd`/repo.git/work" >expected &&
+	test_cmp expected actual
+	)
+'
+
 test_done
diff --git a/test-subprocess.c b/test-subprocess.c
new file mode 100644
index 0000000..667d3e5
--- /dev/null
+++ b/test-subprocess.c
@@ -0,0 +1,21 @@
+#include "cache.h"
+#include "run-command.h"
+
+int main(int argc, char **argv)
+{
+	const char *prefix;
+	struct child_process cp;
+	int nogit = 0;
+
+	prefix = setup_git_directory_gently(&nogit);
+	if (nogit)
+		die("No git repo found");
+	if (!strcmp(argv[1], "--setup-work-tree")) {
+		setup_work_tree();
+		argv++;
+	}
+	memset(&cp, 0, sizeof(cp));
+	cp.git_cmd = 1;
+	cp.argv = (const char **)argv+1;
+	return run_command(&cp);
+}
-- 
1.7.3.4.878.g439c7
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 3 of 9 in “t1501: avoid bashisms”
  1. 1/2 t1501: avoid bashismsNguyễn Thái Ngọc Duy, Dec 25, 2010
  2. 2/2 setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwdNguyễn Thái Ngọc Duy, Dec 25, 2010
  3. setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwdNguyễn Thái Ngọc Duy, Dec 26, 2010
  4. setup_explicit_git_dir: adjust relative $GIT_WORK_TREE after moving cwdNguyễn Thái Ngọc Duy, Dec 26, 2010
  5. setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwdNguyễn Thái Ngọc Duy, Dec 27, 2010
  6. Andreas SchwabDec 25, 2010
  7. Nguyen Thai Ngoc DuyDec 25, 2010
  8. Nguyen Thai Ngoc DuyDec 25, 2010
  9. Junio C HamanoDec 26, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.