summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2020-12-02 15:07:14 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-12-02 15:07:14 -0800
commit7091499bc0a9bccd81a1c864de7b5f87a366480e (patch)
tree75130889f941eceb57c6ceb95c6f28dfc83b609c
parentsubmodules: fix of regression on fetching of non-init subsub-repo (diff)
downloadtgif-7091499bc0a9bccd81a1c864de7b5f87a366480e.tar.xz
Revert "submodules: fix of regression on fetching of non-init subsub-repo"
This reverts commit 1b7ac4e6d4d490b224f5206af7418ed74e490608; in <CAN0XMOLiS_8JZKF_wW70BvRRxkDHyUoa=Z3ODtB_Bd6f5Y=7JQ@mail.gmail.com>, Ralf Thielow reports that "git fetch" with submodule.recurse set can result in a bogus and infinitely recursive fetching of the same submodule.
-rw-r--r--submodule.c14
-rwxr-xr-xt/t5526-fetch-submodules.sh63
2 files changed, 10 insertions, 67 deletions
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