setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwd
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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e7d1efbe9d
commit
0ed7481347
1
.gitignore
vendored
1
.gitignore
vendored
@ -175,6 +175,7 @@
|
|||||||
/test-sha1
|
/test-sha1
|
||||||
/test-sigchain
|
/test-sigchain
|
||||||
/test-string-pool
|
/test-string-pool
|
||||||
|
/test-subprocess
|
||||||
/test-svn-fe
|
/test-svn-fe
|
||||||
/test-treap
|
/test-treap
|
||||||
/common-cmds.h
|
/common-cmds.h
|
||||||
|
1
Makefile
1
Makefile
@ -425,6 +425,7 @@ TEST_PROGRAMS_NEED_X += test-run-command
|
|||||||
TEST_PROGRAMS_NEED_X += test-sha1
|
TEST_PROGRAMS_NEED_X += test-sha1
|
||||||
TEST_PROGRAMS_NEED_X += test-sigchain
|
TEST_PROGRAMS_NEED_X += test-sigchain
|
||||||
TEST_PROGRAMS_NEED_X += test-string-pool
|
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-svn-fe
|
||||||
TEST_PROGRAMS_NEED_X += test-treap
|
TEST_PROGRAMS_NEED_X += test-treap
|
||||||
TEST_PROGRAMS_NEED_X += test-index-version
|
TEST_PROGRAMS_NEED_X += test-index-version
|
||||||
|
8
setup.c
8
setup.c
@ -221,6 +221,14 @@ void setup_work_tree(void)
|
|||||||
git_dir = make_absolute_path(git_dir);
|
git_dir = make_absolute_path(git_dir);
|
||||||
if (!work_tree || chdir(work_tree))
|
if (!work_tree || chdir(work_tree))
|
||||||
die("This operation must be run in a 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));
|
set_git_dir(make_relative_path(git_dir, work_tree));
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
}
|
}
|
||||||
|
@ -340,4 +340,11 @@ test_expect_success 'make_relative_path handles double slashes in GIT_DIR' '
|
|||||||
git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file
|
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 \
|
||||||
|
test-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&
|
||||||
|
echo "$TRASH_DIRECTORY/repo.git/work" >expected &&
|
||||||
|
test_cmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
21
test-subprocess.c
Normal file
21
test-subprocess.c
Normal file
@ -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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user