diff --git a/submodule.c b/submodule.c index eef5204e64..b3bb59f066 100644 --- a/submodule.c +++ b/submodule.c @@ -499,6 +499,12 @@ void prepare_submodule_repo_env(struct strvec *out) DEFAULT_GIT_DIR_ENVIRONMENT); } +static void prepare_submodule_repo_env_in_gitdir(struct strvec *out) +{ + prepare_submodule_repo_env_no_git_dir(out); + strvec_pushf(out, "%s=.", GIT_DIR_ENVIRONMENT); +} + /* * Initialize a repository struct for a submodule based on the provided 'path'. * @@ -1449,8 +1455,8 @@ static int get_next_submodule(struct child_process *cp, if (task->repo) { struct strbuf submodule_prefix = STRBUF_INIT; child_process_init(cp); - cp->dir = task->repo->worktree; - prepare_submodule_repo_env(&cp->env_array); + cp->dir = task->repo->gitdir; + prepare_submodule_repo_env_in_gitdir(&cp->env_array); cp->git_cmd = 1; if (!spf->quiet) strbuf_addf(err, _("Fetching submodule %s%s\n"), @@ -1499,9 +1505,9 @@ static int get_next_submodule(struct child_process *cp, spf->prefix, task->sub->path); child_process_init(cp); - prepare_submodule_repo_env(&cp->env_array); + prepare_submodule_repo_env_in_gitdir(&cp->env_array); cp->git_cmd = 1; - cp->dir = task->repo->worktree; + cp->dir = task->repo->gitdir; strvec_init(&cp->args); strvec_pushv(&cp->args, spf->args.v); diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index ce34a0d8f2..63205dfdf9 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -719,67 +719,4 @@ test_expect_success 'fetch new submodule commit intermittently referenced by sup ) ' -add_commit_push () { - dir="$1" - msg="$2" - shift 2 - git -C "$dir" add "$@" && - git -C "$dir" commit -a -m "$msg" && - git -C "$dir" push -} - -compare_refs_in_dir () { - fail= && - if test "x$1" = 'x!' - then - fail='!' && - shift - fi && - git -C "$1" rev-parse --verify "$2" >expect && - git -C "$3" rev-parse --verify "$4" >actual && - eval $fail test_cmp expect actual -} - - -test_expect_success 'setup nested submodule fetch test' ' - # does not depend on any previous test setups - - for repo in outer middle inner - do - ( - git init --bare $repo && - git clone $repo ${repo}_content && - echo "$repo" >"${repo}_content/file" && - add_commit_push ${repo}_content "initial" file - ) || return 1 - done && - - git clone outer A && - git -C A submodule add "$pwd/middle" && - git -C A/middle/ submodule add "$pwd/inner" && - add_commit_push A/middle/ "adding inner sub" .gitmodules inner && - add_commit_push A/ "adding middle sub" .gitmodules middle && - - git clone outer B && - git -C B/ submodule update --init middle && - - compare_refs_in_dir A HEAD B HEAD && - compare_refs_in_dir A/middle HEAD B/middle HEAD && - test -f B/file && - test -f B/middle/file && - ! test -f B/middle/inner/file && - - echo "change on inner repo of A" >"A/middle/inner/file" && - add_commit_push A/middle/inner "change on inner" file && - add_commit_push A/middle "change on inner" inner && - add_commit_push A "change on inner" middle -' - -test_expect_success 'fetching a superproject containing an uninitialized sub/sub project' ' - # depends on previous test for setup - - git -C B/ fetch && - compare_refs_in_dir A origin/master B origin/master -' - test_done