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

[PATCH 2/6] connect: uniformize and group CONNECT_DIAG_URL handling code

From
Mike Hommey <mh@glandium.org>
Date
May 1, 2016, 06:02 UTC
Message-ID
<1462082573-17992-3-git-send-email-mh@glandium.org>
In-Reply-To
<1462082573-17992-1-git-send-email-mh@glandium.org>

The CONNECT_DIAG_URL code for PROTO_GIT and PROTO_SSH were different in subtle ways. Those differences are not significant enough to justify the duplication of code, while this change also avoids starting to initialize a connection at all when handling CONNECT_DIAG_URL.

This also moves the get_host_and_port() call earlier than it was happening, while preserving hostandport intact (get_host_and_port() possibly altering the string it's passed), because all or hostandport, host and port may be used.

Further changes are going to remove several uses of hostandport where get_host_and_port() is used further down the line.

Signed-off-by: Mike Hommey <mh@glandium.org>
---
 connect.c             | 28 +++++++++-------------------
 t/t5500-fetch-pack.sh | 25 +++++++++++++++----------
 2 files changed, 24 insertions(+), 29 deletions(-)
diff --git a/connect.c b/connect.c
index 45308ef..98449bc 100644
--- a/connect.c
+++ b/connect.c
@@ -656,7 +656,8 @@ static struct child_process no_fork = CHILD_PROCESS_INIT;
 struct child_process *git_connect(int fd[2], const char *url,
 				  const char *prog, int flags)
 {
-	char *hostandport, *path;
+	char *hostandport, *path, *host;
+	const char *port = NULL;
 	struct child_process *conn = &no_fork;
 	enum protocol protocol;
 	struct strbuf cmd = STRBUF_INIT;
@@ -667,10 +668,14 @@ struct child_process *git_connect(int fd[2], const char *url,
 	signal(SIGCHLD, SIG_DFL);
 
 	protocol = parse_connect_url(url, &hostandport, &path);
-	if ((flags & CONNECT_DIAG_URL) && (protocol != PROTO_SSH)) {
+	host = xstrdup(hostandport);
+	get_host_and_port(&host, &port);
+	if (flags & CONNECT_DIAG_URL) {
 		printf("Diag: url=%s\n", url ? url : "NULL");
 		printf("Diag: protocol=%s\n", prot_name(protocol));
 		printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL");
+		printf("Diag: userandhost=%s\n", host ? host : "NULL");
+		printf("Diag: port=%s\n", port ? port : "NONE");
 		printf("Diag: path=%s\n", path ? path : "NULL");
 		conn = NULL;
 	} else if (protocol == PROTO_GIT) {
@@ -721,23 +726,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 		if (protocol == PROTO_SSH) {
 			const char *ssh;
 			int putty = 0, tortoiseplink = 0;
-			char *ssh_host = hostandport;
-			const char *port = NULL;
 			transport_check_allowed("ssh");
-			get_host_and_port(&ssh_host, &port);
-
-			if (flags & CONNECT_DIAG_URL) {
-				printf("Diag: url=%s\n", url ? url : "NULL");
-				printf("Diag: protocol=%s\n", prot_name(protocol));
-				printf("Diag: userandhost=%s\n", ssh_host ? ssh_host : "NULL");
-				printf("Diag: port=%s\n", port ? port : "NONE");
-				printf("Diag: path=%s\n", path ? path : "NULL");
-
-				free(hostandport);
-				free(path);
-				free(conn);
-				return NULL;
-			}
 
 			ssh = getenv("GIT_SSH_COMMAND");
 			if (!ssh) {
@@ -779,7 +768,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 				argv_array_push(&conn->args, putty ? "-P" : "-p");
 				argv_array_push(&conn->args, port);
 			}
-			argv_array_push(&conn->args, ssh_host);
+			argv_array_push(&conn->args, host);
 		} else {
 			transport_check_allowed("file");
 		}
@@ -793,6 +782,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 		strbuf_release(&cmd);
 	}
 	free(hostandport);
+	free(host);
 	free(path);
 	return conn;
 }
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index e5f83bf..360c59d 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -537,7 +537,7 @@ check_prot_path () {
 	Diag: protocol=$2
 	Diag: path=$3
 	EOF
-	git fetch-pack --diag-url "$1" | grep -v hostandport= >actual &&
+	git fetch-pack --diag-url "$1" | grep -v host= | grep -v port= >actual &&
 	test_cmp expected actual
 }
 
@@ -546,22 +546,27 @@ check_prot_host_port_path () {
 	case "$2" in
 		*ssh*)
 		pp=ssh
-		uah=userandhost
-		ehost=$(echo $3 | tr -d "[]")
-		diagport="Diag: port=$4"
 		;;
 		*)
-		pp=$p
-		uah=hostandport
-		ehost=$(echo $3$4 | sed -e "s/22$/:22/" -e "s/NONE//")
-		diagport=""
+		pp=$2
 		;;
 	esac
+	case "$4" in
+		NONE)
+		hostandport=$3
+		;;
+		*)
+		hostandport=$3:$4
+		;;
+	esac
+	ehost=$(echo $3 | tr -d "[]")
+	diagport="Diag: port=$4"
 	cat >exp <<-EOF &&
 	Diag: url=$1
 	Diag: protocol=$pp
-	Diag: $uah=$ehost
-	$diagport
+	Diag: hostandport=$hostandport
+	Diag: userandhost=$ehost
+	Diag: port=$4
 	Diag: path=$5
 	EOF
 	grep -v "^$" exp >expected
-- 
2.8.1.16.g58dac65.dirty
Previous: Mike HommeyNext: Torsten Bögershausen
Message 7 of 46 in “connect: various cleanups”
  1. 0/6 connect: various cleanupsMike Hommey, May 1, 2016
  2. 1/6 connect: remove get_port()Mike Hommey, May 1, 2016
  3. Torsten BögershausenMay 1, 2016
  4. Mike HommeyMay 1, 2016
  5. Jeff KingMay 3, 2016
  6. Mike HommeyMay 3, 2016
  7. 2/6 connect: uniformize and group CONNECT_DIAG_URL handling codeMike Hommey, May 1, 2016
  8. Torsten BögershausenMay 1, 2016
  9. Mike HommeyMay 1, 2016
  10. Torsten BögershausenMay 2, 2016
  11. Mike HommeyMay 2, 2016
  12. Torsten BögershausenMay 2, 2016
  13. Mike HommeyMay 2, 2016
  14. Junio C HamanoMay 2, 2016
  15. Junio C HamanoMay 2, 2016
  16. 3/6 connect: only match the host with core.gitProxyMike Hommey, May 1, 2016
  17. 4/6 connect: pass separate host and port to git_tcp_connect and git_proxy_connectMike Hommey, May 1, 2016
  18. 5/6 connect: don't xstrdup target_hostMike Hommey, May 1, 2016
  19. 6/6 connect: move ssh command line preparation to a separate functionMike Hommey, May 1, 2016
  20. 00/11 connect: various cleanupsMike Hommey, May 3, 2016
  21. 01/11 add fetch-pack --diag-url tests for some corner casesMike Hommey, May 3, 2016
  22. Torsten BögershausenMay 3, 2016
  23. Junio C HamanoMay 3, 2016
  24. Torsten BögershausenMay 3, 2016
  25. Mike HommeyMay 3, 2016
  26. Mike HommeyMay 5, 2016
  27. Torsten BögershausenMay 6, 2016
  28. Junio C HamanoMay 6, 2016
  29. 02/11 connect: call get_host_and_port() earlierMike Hommey, May 3, 2016
  30. 03/11 connect: only match the host with core.gitProxyMike Hommey, May 3, 2016
  31. 04/11 connect: fill the host header in the git protocol with the host and port variablesMike Hommey, May 3, 2016
  32. 05/11 connect: make parse_connect_url() return separated host and portMike Hommey, May 3, 2016
  33. 06/11 connect: group CONNECT_DIAG_URL handling codeMike Hommey, May 3, 2016
  34. 07/11 connect: make parse_connect_url() return the user part of the url as a separate valueMike Hommey, May 3, 2016
  35. 08/11 connect: change the --diag-url output to separate user and hostMike Hommey, May 3, 2016
  36. Torsten BögershausenMay 3, 2016
  37. Eric SunshineMay 3, 2016
  38. Mike HommeyMay 3, 2016
  39. 09/11 connect: use "-l user" instead of "user@" on ssh command lineMike Hommey, May 3, 2016
  40. Torsten BögershausenMay 3, 2016
  41. Junio C HamanoMay 3, 2016
  42. Eric SunshineMay 3, 2016
  43. Mike HommeyMay 3, 2016
  44. 10/11 connect: actively reject git:// urls with a user partMike Hommey, May 3, 2016
  45. 11/11 connect: move ssh command line preparation to a separate functionMike Hommey, May 3, 2016
  46. 11/11 connect: move ssh command line preparation to a separate functionMike Hommey, May 3, 2016

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.