git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] fetch: do not run a redundant fetch from submodule

From
Glen Choo <chooglen@google.com>
Date
May 16, 2022, 22:56 UTC
Message-ID
<kl6lr14thysl.fsf@chooglen-macbookpro.roam.corp.google.com>
In-Reply-To
<xmqqczgd16wx.fsf_-_@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 23 quoted lines
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index e3791f09ed..359321e731 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -2187,6 +2187,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
>  		else if (argc > 1)
>  			die(_("fetch --all does not make sense with refspecs"));
>  		(void) for_each_remote(get_one_remote_for_fetch, &list);
> +
> +		/* no point doing fetch_multiple() of one */
> +		if (list.nr == 1)
> +			remote = remote_get(list.items[0].string);
>  	} else if (argc == 0) {
>  		/* No arguments -- use default remote */
>  		remote = remote_get(NULL);
> @@ -2261,7 +2265,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
>  		result = fetch_multiple(&list, max_children);
>  	}
>  
> -	if (!result && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
> +	if (!result && remote && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
>  		struct strvec options = STRVEC_INIT;
>  		int max_children = max_jobs;
IMO "&& remote" is non-inuitive enough to warrant a comment, e.g.
  /* do not update submodules if fetch_multiple() was called */
  if (!result && remote && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
but I suppose that the commit message explains this well enough.
Show 21 quoted lines
> diff --git a/t/t5617-clone-submodules-remote.sh b/t/t5617-clone-submodules-remote.sh
> index ca8f80083a..8b6b482a39 100755
> --- a/t/t5617-clone-submodules-remote.sh
> +++ b/t/t5617-clone-submodules-remote.sh
> @@ -72,6 +72,19 @@ test_expect_success 'clone with --single-branch' '
>  	)
>  '
>  
> +test_expect_success 'fetch --all with --recurse-submodules' '
> +	test_when_finished "rm -fr super_clone" &&
> +	git clone --recurse-submodules srv.bare super_clone &&
> +	(
> +		cd super_clone &&
> +		git config submodule.recurse true &&
> +		git config fetch.parallel 0 &&
> +		git fetch --all 2>../fetch-log
> +	) &&
> +	grep "Fetching sub" fetch-log >fetch-subs &&
> +	test_line_count = 1 fetch-subs
> +'
> +

The test looks good, but I think it belongs in t/t5526-fetch-submodules.sh. I don't see anything else in t5617-clone-submodules-remote.sh that calls "git fetch".

In addition, I think we need one more test that adds another remote. In the above test, we only have one remote, so we hit your new optimization and already pass the test without the need for "&& remote".

Whereas this test fails if we remove "&& remote".
  test_expect_success 'fetch --all with --recurse-submodules and more remotes' '
    test_when_finished "rm -fr super_clone" &&
    git clone --recurse-submodules srv.bare super_clone &&
    cp -r srv.bare srv.bare2 &&
    (
      cd super_clone &&
      git config submodule.recurse true &&
      git config fetch.parallel 0 &&
      git remote add other ../srv.bare2 &&
      git fetch --all 2>../fetch-log
    ) &&
    grep "Fetching sub" fetch-log >fetch-subs &&
    test_line_count = 2 fetch-subs
  '
Previous: Junio C HamanoNext: Junio C Hamano
Message 13 of 17 in “Bugreport - submodules are fetched twice in some cases”
  1. Benedek KozmaApr 29, 2022
  2. Junio C HamanoApr 29, 2022
  3. Glen ChooApr 29, 2022
  4. Junio C HamanoApr 29, 2022
  5. Glen ChooApr 29, 2022
  6. Glen ChooMay 14, 2022
  7. Glen ChooMay 14, 2022
  8. Junio C HamanoMay 14, 2022
  9. Glen ChooMay 16, 2022
  10. Junio C HamanoMay 16, 2022
  11. Junio C HamanoMay 16, 2022
  12. fetch: do not run a redundant fetch from submoduleJunio C Hamano, May 16, 2022
  13. Glen ChooMay 16, 2022
  14. Junio C HamanoMay 16, 2022
  15. fetch: do not run a redundant fetch from submoduleJunio C Hamano, May 16, 2022
  16. Glen ChooMay 17, 2022
  17. Junio C HamanoMay 18, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.