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

Re: [PATCH v3 2/3] builtin/fetch: skip unnecessary tasks when using --negotiate-only

From
Junio C Hamano <gitster@pobox.com>
Date
Dec 22, 2021, 06:42 UTC
Message-ID
<xmqqa6gtkumz.fsf@gitster.g>
In-Reply-To
<20211222001134.28933-3-chooglen@google.com>
Glen Choo <chooglen@google.com> writes:
Show 14 quoted lines
> @@ -2113,6 +2122,17 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
>  		result = fetch_multiple(&list, max_children);
>  	}
>  
> +	/*
> +	 * Skip irrelevant tasks because we know objects were not
> +	 * fetched.
> +	 *
> +	 * NEEDSWORK: as a future optimization, we can return early
> +	 * whenever objects were not fetched e.g. if we already have all
> +	 * of them.
> +	 */
> +	if (negotiate_only)
> +		goto cleanup;

Sorry if I did not mention this in the review of the earlier round, but I think the location this patch places the jump is wrong, especially with the NEEDSWORK comment.

When we are not under negotiate_only, if our earlier call to transport_fetch_refs() learns to tell us that that we did not add any new objects, we would be able to jump to the clean-up label, making the above code to:

	if (negotiate_only || !num_fetched_objects)
		goto cleanup;

But such a future enhancement is made harder by having this jump here---the optimization the NEEDSWORK comment alludes to has no reason to be incompatible with "--recurse-submodules".

If the above block is placed _after_ the "if the main fetch was successful, and we are not told not to recurse into submodules, then do this" block we see below, then

 (1) this patch still achieves its goal, as we have manually
     and unconditionally turned recursion off;
 (2) such a future enhancement will not be forbidden from working
     with recurse-submodules feature.
Show 25 quoted lines
>  	if (!result && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
>  		struct strvec options = STRVEC_INIT;
>  		int max_children = max_jobs;
> diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
> index 8212ca56dc..732031085e 100755
> --- a/t/t5516-fetch-push.sh
> +++ b/t/t5516-fetch-push.sh
> @@ -229,6 +229,18 @@ test_expect_success 'push with negotiation proceeds anyway even if negotiation f
>  	test_i18ngrep "push negotiation failed" err
>  '
>  
> +test_expect_success 'push with negotiation does not attempt to fetch submodules' '
> +	mk_empty submodule_upstream &&
> +	test_commit -C submodule_upstream submodule_commit &&
> +	git submodule add ./submodule_upstream submodule &&
> +	mk_empty testrepo &&
> +	git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
> +	test_commit -C testrepo unrelated_commit &&
> +	git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
> +	git -c submodule.recurse=true -c protocol.version=2 -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err &&
> +	! grep "Fetching submodule" err
> +'
> +
>  test_expect_success 'push without wildcard' '
>  	mk_empty testrepo &&
Previous: Glen ChooNext: Glen Choo
Message 17 of 50 in “builtin/fetch: skip unnecessary tasks when using --negotiate-only”
  1. builtin/fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Dec 7, 2021
  2. Jonathan TanDec 9, 2021
  3. Glen ChooDec 9, 2021
  4. Jonathan TanDec 13, 2021
  5. Glen ChooDec 16, 2021
  6. builtin/fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Dec 17, 2021
  7. Junio C HamanoDec 17, 2021
  8. Glen ChooDec 20, 2021
  9. Junio C HamanoDec 20, 2021
  10. Glen ChooDec 20, 2021
  11. Junio C HamanoDec 20, 2021
  12. Glen ChooDec 21, 2021
  13. Glen ChooDec 21, 2021
  14. 0/3 builtin/fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Dec 22, 2021
  15. 1/3 builtin/fetch: use goto cleanup in cmd_fetch()Glen Choo, Dec 22, 2021
  16. 2/3 builtin/fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Dec 22, 2021
  17. Junio C HamanoDec 22, 2021
  18. Glen ChooDec 22, 2021
  19. Junio C HamanoDec 22, 2021
  20. Glen ChooDec 22, 2021
  21. 3/3 builtin/fetch: die on --negotiate-only and --recurse-submodulesGlen Choo, Dec 22, 2021
  22. Junio C HamanoDec 22, 2021
  23. Jonathan TanDec 23, 2021
  24. 0/3 fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Jan 13, 2022
  25. 1/3 fetch: use goto cleanup in cmd_fetch()Glen Choo, Jan 13, 2022
  26. 2/3 fetch: skip tasks related to fetching objectsGlen Choo, Jan 13, 2022
  27. 3/3 fetch --negotiate-only: do not update submodulesGlen Choo, Jan 13, 2022
  28. Junio C HamanoJan 13, 2022
  29. 0/3 fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Jan 18, 2022
  30. 1/3 fetch: use goto cleanup in cmd_fetch()Glen Choo, Jan 18, 2022
  31. 2/3 fetch: skip tasks related to fetching objectsGlen Choo, Jan 18, 2022
  32. 3/3 fetch --negotiate-only: do not update submodulesGlen Choo, Jan 18, 2022
  33. Junio C HamanoJan 18, 2022
  34. Glen ChooJan 18, 2022
  35. Junio C HamanoJan 19, 2022
  36. 0/3 fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Jan 19, 2022
  37. 1/3 fetch: use goto cleanup in cmd_fetch()Glen Choo, Jan 19, 2022
  38. 2/3 fetch: skip tasks related to fetching objectsGlen Choo, Jan 19, 2022
  39. 3/3 fetch --negotiate-only: do not update submodulesGlen Choo, Jan 19, 2022
  40. Jiang XinJan 20, 2022
  41. Glen ChooJan 20, 2022
  42. 0/3 fetch: skip unnecessary tasks when using --negotiate-onlyGlen Choo, Jan 20, 2022
  43. 1/3 fetch: use goto cleanup in cmd_fetch()Glen Choo, Jan 20, 2022
  44. 2/3 fetch: skip tasks related to fetching objectsGlen Choo, Jan 20, 2022
  45. 3/3 fetch --negotiate-only: do not update submodulesGlen Choo, Jan 20, 2022
  46. Junio C HamanoJan 20, 2022
  47. Glen ChooJan 20, 2022
  48. Re* [PATCH v7 0/3] fetch: skip unnecessary tasks when using --negotiate-onlyJunio C Hamano, Jan 20, 2022
  49. Glen ChooJan 20, 2022
  50. Jiang XinJan 21, 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.