]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Revert "submodules: fix of regression on fetching of non-init subsub-repo"
authorJunio C Hamano <gitster@pobox.com>
Wed, 2 Dec 2020 23:07:14 +0000 (15:07 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 Dec 2020 23:07:14 +0000 (15:07 -0800)
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.

submodule.c
t/t5526-fetch-submodules.sh

index eef5204e641e198847e86e5e36c1115970831b8e..b3bb59f06644739c859adb22836e2761da2a91be 100644 (file)
@@ -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);
index ce34a0d8f2b0b249f823b4dc7460eeb74cecbb06..63205dfdf962dc31c9db5ba038674e12760a9909 100755 (executable)
@@ -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