Re: [PATCH v9 2/3] introduce submodule.hasSuperproject record
- From
Glen Choo <chooglen@google.com>
- Date
- Mar 10, 2022, 23:42 UTC
- Message-ID
- <kl6l4k45s7cb.fsf@chooglen-macbookpro.roam.corp.google.com>
- In-Reply-To
- <xmqqwnh1bgr4.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 64 quoted lines
>> diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
>> index bef9ab22d4..f53808d995 100644
>> --- a/builtin/submodule--helper.c
>> +++ b/builtin/submodule--helper.c
>> @@ -2672,6 +2677,11 @@ static int run_update_procedure(int argc, const char **argv, const char *prefix)
>> &update_data.update_strategy);
>>
>> free(prefixed_path);
>> + /*
>> + * This entry point is always called from a submodule, so this is a
>> + * good place to set a hint that this repo is a submodule.
>> + */
>> + git_config_set("submodule.hasSuperproject", "true");
>> return update_submodule2(&update_data);
>> }
>
> That matched my tentative resolution I made last night, but what do
> you think about this part of the test added by the patch?
>
> diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
> index 11cccbb333..ec2397fc69 100755
> --- a/t/t7406-submodule-update.sh
> +++ b/t/t7406-submodule-update.sh
> @@ -1061,4 +1061,12 @@ test_expect_success 'submodule update --quiet passes quietness to fetch with a s
> )
> '
>
> +test_expect_success 'submodule update adds submodule.hasSuperproject to older repos' '
> + (cd super &&
> + test_unconfig submodule.hasSuperproject &&
> + git submodule update &&
> + test_cmp_config -C submodule true --type=bool submodule.hasSuperproject
> + )
> +'
> +
> test_done
>
> We go to "super", make sure that superproject does not have
> submodule.hasSuperproject set, run "git submodule update", and see
> if the configuration file in "submodule" subdirectory has the
> variable set. It does not clear the variable from the submodule
> before starting, so the variable given to the submodule when it was
> cloned would be there, even if "git submodule update" failed to set
> it.
>
> I am wondering if it should do something like the attached instead.
>
> We
>
> * clear the variable from "super" and "super/submodule"
> repositories;
>
> * run "git submodule update";
>
> * ensure that "git submodule update" did not touch "super/.git/config";
>
> * ensure that "git submodule update" added the variable to
> "super/submodule/.git/config".
>
> Clearing the variable from "super" is technically wrong because the
> repository is set up as a submodule of "recursivesuper" and if we
> had further tests, we should restore it in "super", but the point is
> that we are makng sure "git submodule update" sets the variable in
> the configuration file of the submodule, and not in the superproject's. Yes, the test you've described is closer to what I thought the original test was trying to do. Seeing this test pass gave me a false sense of confidence hm..
Show 7 quoted lines
> With the conflict resolution above, this "corrected" test fails and > shows that superproject's configuration file is updated after "git > submodule update". > > This series alone, without your topic, this "corrected" test fails, > and that is where my "are we sure we are mucking with the > configuration file in the submodule"? comes from.
Yeah looks like we aren't in the submodule after all:
out=$(git submodule--helper run-update-procedure \
${wt_prefix:+--prefix "$wt_prefix"} \
${GIT_QUIET:+--quiet} \
${force:+--force} \
${just_cloned:+--just-cloned} \
${nofetch:+--no-fetch} \
${depth:+"$depth"} \
${update:+--update "$update"} \
${prefix:+--recursive-prefix "$prefix"} \
${sha1:+--oid "$sha1"} \
${subsha1:+--suboid "$subsha1"} \
"--" \
"$sm_path")This says "do the update at this submodule path", but this is being run from the superproject.
So I suppose the way forward is one of the following:
- Revert my original suggestion - Revert my original suggestion AND remove the git_config_set from "module_clone()" (before this, we unconditionally set this value in git-submodule.sh anyway) - Set the config in the submodule even though we are running from the superproject (this is possible, ensure_core_worktree() does this).
In any case, sorry for the faulty suggestion :(