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

Re: [PATCH] config: option transfer.ipversion to set transport protocol version for network fetches

From
Jeff King <peff@peff.net>
Date
Sep 16, 2020, 20:02 UTC
Message-ID
<20200916200203.GA37225@coredump.intra.peff.net>
In-Reply-To
<20200915135428.GA28038@pflmari>
On Tue, Sep 15, 2020 at 03:54:28PM +0200, Alex Riesen wrote:
Show 15 quoted lines
> Jeff King, Tue, Sep 15, 2020 15:05:06 +0200:
> > On Tue, Sep 15, 2020 at 01:50:25PM +0200, Alex Riesen wrote:
> > > Sure! Thinking about it, I actually would have preferred to have both: a
> > > config option and a command-line option. So that I can set --ipv4 in, say,
> > > ~/.config/git/config file, but still have the option to try --ipv6 from time
> > > to time to check if the network setup magically fixed itself.
> > > 
> > > What would the preferred name for that config option be? fetch.ipv?
> > 
> > It looks like we've got similar options for clone/pull (which are really
> > fetch under the hood of course) and push. We have the "transfer.*"
> > namespace which applies to both already. So maybe "transfer.ipversion"
> > or something?
> 
> Something like this?

That's the right direction, but I think we'd want to make sure it impacted all of the spots that allow switching. "clone" on the fetching side, but probably also "push".

Each of those commands could learn the same config, but it might be easier to just enforce it in the transport layer. Something like this maybe (compiled but not tested):

diff --git a/builtin/fetch.c b/builtin/fetch.c
index a6d3268661..2f7a734eb2 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1267,7 +1267,8 @@ static struct transport *prepare_transport(struct remote *remote, int deepen)
 
 	transport = transport_get(remote, NULL);
 	transport_set_verbosity(transport, verbosity, progress);
-	transport->family = family;
+	if (family)
+		transport->family = family;
 	if (upload_pack)
 		set_option(transport, TRANS_OPT_UPLOADPACK, upload_pack);
 	if (keep)
diff --git a/builtin/push.c b/builtin/push.c
index bc94078e72..f7a40b65cd 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -343,7 +343,8 @@ static int push_with_options(struct transport *transport, struct refspec *rs,
 	char *anon_url = transport_anonymize_url(transport->url);
 
 	transport_set_verbosity(transport, verbosity, progress);
-	transport->family = family;
+	if (family)
+		transport->family = family;
 
 	if (receivepack)
 		transport_set_option(transport,
diff --git a/transport.c b/transport.c
index 43e24bf1e5..92f81b414d 100644
--- a/transport.c
+++ b/transport.c
@@ -919,6 +919,20 @@ static struct transport_vtable builtin_smart_vtable = {
 	disconnect_git
 };
 
+enum transport_family default_transport_family(void)
+{
+	const char *v;
+
+	if (git_config_get_string_tmp("core.ipversion", &v))
+		return TRANSPORT_FAMILY_ALL;
+	else if (!strcmp(v, "ipv4"))
+		return TRANSPORT_FAMILY_IPV4;
+	else if (!strcmp(v, "ipv6"))
+		return TRANSPORT_FAMILY_IPV6;
+
+	die(_("invalid core.ipversion: %s"), v);
+}
+
 struct transport *transport_get(struct remote *remote, const char *url)
 {
 	const char *helper;
@@ -948,6 +962,8 @@ struct transport *transport_get(struct remote *remote, const char *url)
 			helper = xstrndup(url, p - url);
 	}
 
+	ret->family = default_transport_family();
+
 	if (helper) {
 		transport_helper_init(ret, helper);
 	} else if (starts_with(url, "rsync:")) {

A few notes:

  - it cheats a little by noting that command-line options can't get it
    to "ALL". It might be a bit cleaner if we have an explicit
    TRANSPORT_FAMILY_UNSET, and then resolve the default at look-up
    time.

  - it probably needs more "if (family)" spots in each command, which is
    unfortunate (which again might go away if "UNSET" is 0).

  - I waffled on the name. transfer.* is where we put things that apply
    to both push/fetch, but it's usually more related to the git layer.
    This is more of a core networking decision, and if we added other
    network programs, I'd expect them to respect it. So maybe "core." is
    a better namespace.

-Peff
Previous: Alex RiesenNext: Alex Riesen
Message 23 of 49 in “sub-fetches discard --ipv4|6 option”
  1. Alex RiesenSep 14, 2020
  2. Jeff KingSep 14, 2020
  3. Alex RiesenSep 15, 2020
  4. Pass --ipv4 and --ipv6 options to sub-fetches when fetching multiple remotes and submodulesAlex Riesen, Sep 15, 2020
  5. Junio C HamanoSep 15, 2020
  6. Alex RiesenSep 16, 2020
  7. Jeff KingSep 15, 2020
  8. Junio C HamanoSep 16, 2020
  9. Alex RiesenSep 16, 2020
  10. Jeff KingSep 15, 2020
  11. Alex RiesenSep 15, 2020
  12. Jeff KingSep 15, 2020
  13. Junio C HamanoSep 15, 2020
  14. Jeff KingSep 15, 2020
  15. Junio C HamanoSep 15, 2020
  16. Jeff KingSep 16, 2020
  17. Junio C HamanoSep 16, 2020
  18. Alex RiesenSep 15, 2020
  19. Jeff KingSep 16, 2020
  20. Alex RiesenSep 17, 2020
  21. Jeff KingSep 22, 2020
  22. config: option transfer.ipversion to set transport protocol version for network fetchesAlex Riesen, Sep 15, 2020
  23. Jeff KingSep 16, 2020
  24. Alex RiesenSep 17, 2020
  25. Config option to set the transport protocol version for network fetchesAlex Riesen, Sep 17, 2020
  26. Jeff KingSep 17, 2020
  27. Alex RiesenSep 17, 2020
  28. Jeff KingSep 17, 2020
  29. Alex RiesenSep 17, 2020
  30. Junio C HamanoDec 22, 2020
  31. Alex RiesenJan 7, 2021
  32. Alex RiesenSep 17, 2020
  33. Alex RiesenSep 17, 2020
  34. Junio C HamanoSep 16, 2020
  35. Jeff KingSep 16, 2020
  36. Junio C HamanoSep 16, 2020
  37. Junio C HamanoSep 16, 2020
  38. Jeff KingSep 17, 2020
  39. Junio C HamanoSep 17, 2020
  40. Junio C HamanoSep 16, 2020
  41. Alex RiesenSep 17, 2020
  42. Junio C HamanoSep 17, 2020
  43. Alex RiesenSep 18, 2020
  44. Junio C HamanoSep 18, 2020
  45. Alex RiesenSep 21, 2020
  46. Jeff KingSep 22, 2020
  47. Alex RiesenSep 17, 2020
  48. Alex RiesenSep 17, 2020
  49. Junio C HamanoSep 14, 2020

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.