Merge branch 'pk/subsub-fetch-fix'

"git fetch" did not work correctly with nested submodules where the
innermost submodule that is not of interest got updated in the
upstream, which has been corrected.

* pk/subsub-fetch-fix:
  submodules: fix of regression on fetching of non-init subsub-repo
This commit is contained in:
Junio C Hamano 2020-11-25 15:24:52 -08:00
commit d627bf6039
2 changed files with 67 additions and 10 deletions

View file

@ -499,12 +499,6 @@ 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'.
*
@ -1455,8 +1449,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->gitdir;
prepare_submodule_repo_env_in_gitdir(&cp->env_array);
cp->dir = task->repo->worktree;
prepare_submodule_repo_env(&cp->env_array);
cp->git_cmd = 1;
if (!spf->quiet)
strbuf_addf(err, _("Fetching submodule %s%s\n"),
@ -1505,9 +1499,9 @@ static int get_next_submodule(struct child_process *cp,
spf->prefix, task->sub->path);
child_process_init(cp);
prepare_submodule_repo_env_in_gitdir(&cp->env_array);
prepare_submodule_repo_env(&cp->env_array);
cp->git_cmd = 1;
cp->dir = task->repo->gitdir;
cp->dir = task->repo->worktree;
strvec_init(&cp->args);
strvec_pushv(&cp->args, spf->args.v);

View file

@ -719,4 +719,67 @@ 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