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.
This commit is contained in:
parent
1b7ac4e6d4
commit
7091499bc0
14
submodule.c
14
submodule.c
@ -499,6 +499,12 @@ void prepare_submodule_repo_env(struct strvec *out)
|
|||||||
DEFAULT_GIT_DIR_ENVIRONMENT);
|
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'.
|
* 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) {
|
if (task->repo) {
|
||||||
struct strbuf submodule_prefix = STRBUF_INIT;
|
struct strbuf submodule_prefix = STRBUF_INIT;
|
||||||
child_process_init(cp);
|
child_process_init(cp);
|
||||||
cp->dir = task->repo->worktree;
|
cp->dir = task->repo->gitdir;
|
||||||
prepare_submodule_repo_env(&cp->env_array);
|
prepare_submodule_repo_env_in_gitdir(&cp->env_array);
|
||||||
cp->git_cmd = 1;
|
cp->git_cmd = 1;
|
||||||
if (!spf->quiet)
|
if (!spf->quiet)
|
||||||
strbuf_addf(err, _("Fetching submodule %s%s\n"),
|
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);
|
spf->prefix, task->sub->path);
|
||||||
|
|
||||||
child_process_init(cp);
|
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->git_cmd = 1;
|
||||||
cp->dir = task->repo->worktree;
|
cp->dir = task->repo->gitdir;
|
||||||
|
|
||||||
strvec_init(&cp->args);
|
strvec_init(&cp->args);
|
||||||
strvec_pushv(&cp->args, spf->args.v);
|
strvec_pushv(&cp->args, spf->args.v);
|
||||||
|
@ -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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user