Browse Source

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>
maint
Nguyễn Thái Ngọc Duy 14 years ago committed by Junio C Hamano
parent
commit
0ed7481347
  1. 1
      .gitignore
  2. 1
      Makefile
  3. 8
      setup.c
  4. 7
      t/t1501-worktree.sh
  5. 21
      test-subprocess.c

1
.gitignore vendored

@ -175,6 +175,7 @@ @@ -175,6 +175,7 @@
/test-sha1
/test-sigchain
/test-string-pool
/test-subprocess
/test-svn-fe
/test-treap
/common-cmds.h

1
Makefile

@ -425,6 +425,7 @@ TEST_PROGRAMS_NEED_X += test-run-command @@ -425,6 +425,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

8
setup.c

@ -221,6 +221,14 @@ void setup_work_tree(void) @@ -221,6 +221,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;
}

7
t/t1501-worktree.sh

@ -340,4 +340,11 @@ test_expect_success 'make_relative_path handles double slashes in GIT_DIR' ' @@ -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
'

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

21
test-subprocess.c

@ -0,0 +1,21 @@ @@ -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…
Cancel
Save