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

[PATCH v4 00/11] protocol transition

From
BWBrandon Williams <bmwill@google.com>
Date
Oct 16, 2017, 17:55 UTC
Message-ID
<20171016175532.73459-1-bmwill@google.com>
In-Reply-To
<20171003201507.3589-1-bmwill@google.com>
Changes in v4:
 * Added more tests for the new handeling of ssh variants.
 * Removed the 'default' case in upload_pack and receive_pack and instead
   ensured that all enum values were accounted for.  This way when a new
   protocol version is introduced the compiler will throw an error if the new
   protocol version isn't accounted for in these switch statements.
 * Added Jonathan's Documentation patch ontop of the series (with the small
   change I pointed out in reply to the patch itself)
 * A few other small changes due to reviewer comments.
Brandon Williams (9):
  pkt-line: add packet_write function
  protocol: introduce protocol extension mechanisms
  daemon: recognize hidden request arguments
  upload-pack, receive-pack: introduce protocol version 1
  connect: teach client to recognize v1 server response
  connect: tell server that the client understands v1
  http: tell server that the client understands v1
  i5700: add interop test for protocol transition
  ssh: introduce a 'simple' ssh variant
Jonathan Tan (2):
  connect: in ref advertisement, shallows are last
  Documentation: document Extra Parameters
 Documentation/config.txt                  |  44 +++-
 Documentation/git.txt                     |  15 +-
 Documentation/technical/http-protocol.txt |   8 +
 Documentation/technical/pack-protocol.txt |  43 +++-
 Makefile                                  |   1 +
 builtin/receive-pack.c                    |  17 ++
 cache.h                                   |  10 +
 connect.c                                 | 354 ++++++++++++++++++++----------
 daemon.c                                  |  71 +++++-
 http.c                                    |  18 ++
 pkt-line.c                                |   6 +
 pkt-line.h                                |   1 +
 protocol.c                                |  79 +++++++
 protocol.h                                |  33 +++
 t/interop/i5700-protocol-transition.sh    |  68 ++++++
 t/lib-httpd/apache.conf                   |   7 +
 t/t5601-clone.sh                          |  26 ++-
 t/t5700-protocol-v1.sh                    | 294 +++++++++++++++++++++++++
 upload-pack.c                             |  20 +-
 19 files changed, 967 insertions(+), 148 deletions(-)
 create mode 100644 protocol.c
 create mode 100644 protocol.h
 create mode 100755 t/interop/i5700-protocol-transition.sh
 create mode 100755 t/t5700-protocol-v1.sh
--- interdiff with 'origin/bw/protocol-v1'
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index 1c561bdd9..a0e45f288 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -219,6 +219,10 @@ smart server reply:
    S: 003c2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0\n
    S: 003fa3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}\n
 
+The client may send Extra Parameters (see
+Documentation/technical/pack-protocol.txt) as a colon-separated string
+in the Git-Protocol HTTP header.
+
 Dumb Server Response
 ^^^^^^^^^^^^^^^^^^^^
 Dumb servers MUST respond with the dumb server reply format.
@@ -269,7 +273,11 @@ the C locale ordering.  The stream SHOULD include the default ref
 named `HEAD` as the first ref.  The stream MUST include capability
 declarations behind a NUL on the first ref.
 
+The returned response contains "version 1" if "version=1" was sent as an
+Extra Parameter.
+
   smart_reply     =  PKT-LINE("# service=$servicename" LF)
+		     *1("version 1")
 		     ref_list
 		     "0000"
   ref_list        =  empty_list / non_empty_list
diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt
index ed1eae8b8..cd31edc91 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/Documentation/technical/pack-protocol.txt
@@ -39,6 +39,19 @@ communicates with that invoked process over the SSH connection.
 The file:// transport runs the 'upload-pack' or 'receive-pack'
 process locally and communicates with it over a pipe.
 
+Extra Parameters
+----------------
+
+The protocol provides a mechanism in which clients can send additional
+information in its first message to the server. These are called "Extra
+Parameters", and are supported by the Git, SSH, and HTTP protocols.
+
+Each Extra Parameter takes the form of `<key>=<value>` or `<key>`.
+
+Servers that receive any such Extra Parameters MUST ignore all
+unrecognized keys. Currently, the only Extra Parameter recognized is
+"version=1".
+
 Git Transport
 -------------
 
@@ -46,18 +59,25 @@ The Git transport starts off by sending the command and repository
 on the wire using the pkt-line format, followed by a NUL byte and a
 hostname parameter, terminated by a NUL byte.
 
-   0032git-upload-pack /project.git\0host=myserver.com\0
+   0033git-upload-pack /project.git\0host=myserver.com\0
+
+The transport may send Extra Parameters by adding an additional NUL
+byte, and then adding one or more NUL-terminated strings:
+
+   003egit-upload-pack /project.git\0host=myserver.com\0\0version=1\0
 
 --
-   git-proto-request = request-command SP pathname NUL [ host-parameter NUL ]
+   git-proto-request = request-command SP pathname NUL
+		       [ host-parameter NUL ] [ NUL extra-parameters ]
    request-command   = "git-upload-pack" / "git-receive-pack" /
 		       "git-upload-archive"   ; case sensitive
    pathname          = *( %x01-ff ) ; exclude NUL
    host-parameter    = "host=" hostname [ ":" port ]
+   extra-parameters  = 1*extra-parameter
+   extra-parameter   = 1*( %x01-ff ) NUL
 --
 
-Only host-parameter is allowed in the git-proto-request. Clients
-MUST NOT attempt to send additional parameters. It is used for the
+host-parameter is used for the
 git-daemon name based virtual hosting.  See --interpolated-path
 option to git daemon, with the %H/%CH format characters.
 
@@ -117,6 +137,12 @@ we execute it without the leading '/'.
 		     v
    ssh user@example.com "git-upload-pack '~alice/project.git'"
 
+Depending on the value of the `protocol.version` configuration variable,
+Git may attempt to send Extra Parameters as a colon-separated string in
+the GIT_PROTOCOL environment variable. This is done only if
+the `ssh.variant` configuration variable indicates that the ssh command
+supports passing environment variables as an argument.
+
 A few things to remember here:
 
 - The "command name" is spelled with dash (e.g. git-upload-pack), but
@@ -137,11 +163,13 @@ Reference Discovery
 -------------------
 
 When the client initially connects the server will immediately respond
-with a listing of each reference it has (all branches and tags) along
+with a version number (if "version=1" is sent as an Extra Parameter),
+and a listing of each reference it has (all branches and tags) along
 with the object name that each reference currently points to.
 
-   $ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |
+   $ echo -e -n "0044git-upload-pack /schacon/gitbook.git\0host=example.com\0\0version=1\0" |
       nc -v example.com 9418
+   000aversion 1
    00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack
 		side-band side-band-64k ofs-delta shallow no-progress include-tag
    00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration
@@ -165,7 +193,8 @@ immediately after the ref itself, if presented. A conforming server
 MUST peel the ref if it's an annotated tag.
 
 ----
-  advertised-refs  =  (no-refs / list-of-refs)
+  advertised-refs  =  *1("version 1")
+		      (no-refs / list-of-refs)
 		      *shallow
 		      flush-pkt
 
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 94b7d29ea..839c1462d 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1966,15 +1966,17 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 
 	switch (determine_protocol_version_server()) {
 	case protocol_v1:
-		if (advertise_refs || !stateless_rpc)
-			packet_write_fmt(1, "version 1\n");
 		/*
 		 * v1 is just the original protocol with a version string,
 		 * so just fall through after writing the version string.
 		 */
+		if (advertise_refs || !stateless_rpc)
+			packet_write_fmt(1, "version 1\n");
+
+		/* fallthrough */
 	case protocol_v0:
 		break;
-	default:
+	case protocol_unknown_version:
 		BUG("unknown protocol version");
 	}
 
diff --git a/connect.c b/connect.c
index 65cee49b6..7fbd396b3 100644
--- a/connect.c
+++ b/connect.c
@@ -836,7 +836,8 @@ static enum ssh_variant determine_ssh_variant(const char *ssh_command,
 		}
 	}
 
-	if (!strcasecmp(variant, "ssh"))
+	if (!strcasecmp(variant, "ssh") ||
+	    !strcasecmp(variant, "ssh.exe"))
 		ssh_variant = VARIANT_SSH;
 	else if (!strcasecmp(variant, "plink") ||
 		 !strcasecmp(variant, "plink.exe"))
diff --git a/daemon.c b/daemon.c
index 36cc794c9..e37e343d0 100644
--- a/daemon.c
+++ b/daemon.c
@@ -582,6 +582,9 @@ static void canonicalize_client(struct strbuf *out, const char *in)
 
 /*
  * Read the host as supplied by the client connection.
+ *
+ * Returns a pointer to the character after the NUL byte terminating the host
+ * arguemnt, or 'extra_args' if there is no host arguemnt.
  */
 static char *parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen)
 {
diff --git a/pkt-line.c b/pkt-line.c
index c025d0332..7006b3587 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -188,7 +188,7 @@ static int packet_write_gently(const int fd_out, const char *buf, size_t size)
 	return 0;
 }
 
-void packet_write(const int fd_out, const char *buf, size_t size)
+void packet_write(int fd_out, const char *buf, size_t size)
 {
 	if (packet_write_gently(fd_out, buf, size))
 		die_errno("packet write failed");
diff --git a/pkt-line.h b/pkt-line.h
index d9e9783b1..3dad583e2 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -22,7 +22,7 @@
 void packet_flush(int fd);
 void packet_write_fmt(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
 void packet_buf_flush(struct strbuf *buf);
-void packet_write(const int fd_out, const char *buf, size_t size);
+void packet_write(int fd_out, const char *buf, size_t size);
 void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
 int packet_flush_gently(int fd);
 int packet_write_fmt_gently(int fd, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index ee1a24c5b..86811a0c3 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -309,21 +309,18 @@ test_expect_success 'clone checking out a tag' '
 setup_ssh_wrapper () {
 	test_expect_success 'setup ssh wrapper' '
 		cp "$GIT_BUILD_DIR/t/helper/test-fake-ssh$X" \
-			"$TRASH_DIRECTORY/ssh-wrapper$X" &&
-		GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper$X" &&
+			"$TRASH_DIRECTORY/ssh$X" &&
+		GIT_SSH="$TRASH_DIRECTORY/ssh$X" &&
 		export GIT_SSH &&
-		GIT_SSH_VARIANT=ssh &&
-		export GIT_SSH_VARIANT &&
 		export TRASH_DIRECTORY &&
 		>"$TRASH_DIRECTORY"/ssh-output
 	'
 }
 
 copy_ssh_wrapper_as () {
-	cp "$TRASH_DIRECTORY/ssh-wrapper$X" "${1%$X}$X" &&
+	cp "$TRASH_DIRECTORY/ssh$X" "${1%$X}$X" &&
 	GIT_SSH="${1%$X}$X" &&
-	export GIT_SSH &&
-	unset GIT_SSH_VARIANT
+	export GIT_SSH
 }
 
 expect_ssh () {
@@ -365,6 +362,22 @@ test_expect_success 'bracketed hostnames are still ssh' '
 	expect_ssh "-p 123" myhost src
 '
 
+test_expect_success 'OpenSSH variant passes -4' '
+	git clone -4 "[myhost:123]:src" ssh-ipv4-clone &&
+	expect_ssh "-4 -p 123" myhost src
+'
+
+test_expect_success 'variant can be overriden' '
+	git -c ssh.variant=simple clone -4 "[myhost:123]:src" ssh-simple-clone &&
+	expect_ssh myhost src
+'
+
+test_expect_success 'simple is treated as simple' '
+	copy_ssh_wrapper_as "$TRASH_DIRECTORY/simple" &&
+	git clone -4 "[myhost:123]:src" ssh-bracket-clone-simple &&
+	expect_ssh myhost src
+'
+
 test_expect_success 'uplink is treated as simple' '
 	copy_ssh_wrapper_as "$TRASH_DIRECTORY/uplink" &&
 	git clone "[myhost:123]:src" ssh-bracket-clone-uplink &&
diff --git a/upload-pack.c b/upload-pack.c
index ef438e9c2..ef99a029c 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -1071,16 +1071,18 @@ int cmd_main(int argc, const char **argv)
 
 	switch (determine_protocol_version_server()) {
 	case protocol_v1:
-		if (advertise_refs || !stateless_rpc)
-			packet_write_fmt(1, "version 1\n");
 		/*
 		 * v1 is just the original protocol with a version string,
 		 * so just fall through after writing the version string.
 		 */
+		if (advertise_refs || !stateless_rpc)
+			packet_write_fmt(1, "version 1\n");
+
+		/* fallthrough */
 	case protocol_v0:
 		upload_pack();
 		break;
-	default:
+	case protocol_unknown_version:
 		BUG("unknown protocol version");
 	}
 
-- 
2.15.0.rc0.271.g36b669edcc-goog
Previous: Brandon WilliamsNext: Brandon Williams
Message 149 of 161 in “protocol transition”
  1. 0/8 protocol transitionBrandon Williams, Sep 13, 2017
  2. 1/8 pkt-line: add packet_write functionBrandon Williams, Sep 13, 2017
  3. 2/8 protocol: introduce protocol extention mechanismsBrandon Williams, Sep 13, 2017
  4. Stefan BellerSep 13, 2017
  5. Brandon WilliamsSep 18, 2017
  6. Stefan BellerSep 18, 2017
  7. Brandon WilliamsSep 18, 2017
  8. Stefan BellerSep 18, 2017
  9. 3/8 daemon: recognize hidden request argumentsBrandon Williams, Sep 13, 2017
  10. Stefan BellerSep 13, 2017
  11. Brandon WilliamsSep 18, 2017
  12. Jonathan TanSep 21, 2017
  13. Jonathan TanSep 21, 2017
  14. Brandon WilliamsSep 21, 2017
  15. 5/8 connect: teach client to recognize v1 server responseBrandon Williams, Sep 13, 2017
  16. 4/8 upload-pack, receive-pack: introduce protocol version 1Brandon Williams, Sep 13, 2017
  17. 6/8 connect: tell server that the client understands v1Brandon Williams, Sep 13, 2017
  18. 8/8 i5700: add interop test for protocol transitionBrandon Williams, Sep 13, 2017
  19. 7/8 http: tell server that the client understands v1Brandon Williams, Sep 13, 2017
  20. 5/8 connect: die when a capability line comes after a refBrandon Williams, Sep 20, 2017
  21. Jeff KingSep 20, 2017
  22. Brandon WilliamsSep 20, 2017
  23. Jonathan NiederSep 20, 2017
  24. Junio C HamanoSep 21, 2017
  25. connect: in ref advertisement, shallows are lastJonathan Tan, Sep 21, 2017
  26. connect: in ref advertisement, shallows are lastJonathan Tan, Sep 21, 2017
  27. Brandon WilliamsSep 22, 2017
  28. connect: in ref advertisement, shallows are lastJonathan Tan, Sep 22, 2017
  29. Junio C HamanoSep 22, 2017
  30. Junio C HamanoSep 22, 2017
  31. Brandon WilliamsSep 22, 2017
  32. connect: in ref advertisement, shallows are lastJonathan Tan, Sep 22, 2017
  33. Brandon WilliamsSep 22, 2017
  34. Jonathan TanSep 22, 2017
  35. Junio C HamanoSep 24, 2017
  36. connect: in ref advertisement, shallows are lastJonathan Tan, Sep 26, 2017
  37. Brandon WilliamsSep 26, 2017
  38. 0/9 protocol transitionBrandon Williams, Sep 26, 2017
  39. 2/9 pkt-line: add packet_write functionBrandon Williams, Sep 26, 2017
  40. 3/9 protocol: introduce protocol extention mechanismsBrandon Williams, Sep 26, 2017
  41. Junio C HamanoSep 27, 2017
  42. Junio C HamanoSep 27, 2017
  43. Brandon WilliamsSep 29, 2017
  44. Brandon WilliamsSep 28, 2017
  45. Stefan BellerSep 27, 2017
  46. Brandon WilliamsSep 28, 2017
  47. 1/9 connect: in ref advertisement, shallows are lastBrandon Williams, Sep 26, 2017
  48. 6/9 connect: teach client to recognize v1 server responseBrandon Williams, Sep 26, 2017
  49. Junio C HamanoSep 27, 2017
  50. Brandon WilliamsSep 27, 2017
  51. Junio C HamanoSep 27, 2017
  52. Brandon WilliamsSep 28, 2017
  53. 7/9 connect: tell server that the client understands v1Brandon Williams, Sep 26, 2017
  54. Junio C HamanoSep 27, 2017
  55. Junio C HamanoSep 27, 2017
  56. Brandon WilliamsSep 29, 2017
  57. Brandon WilliamsSep 28, 2017
  58. 9/9 i5700: add interop test for protocol transitionBrandon Williams, Sep 26, 2017
  59. 8/9 http: tell server that the client understands v1Brandon Williams, Sep 26, 2017
  60. Junio C HamanoSep 27, 2017
  61. Brandon WilliamsSep 27, 2017
  62. 5/9 upload-pack, receive-pack: introduce protocol version 1Brandon Williams, Sep 26, 2017
  63. Junio C HamanoSep 27, 2017
  64. Brandon WilliamsSep 27, 2017
  65. 4/9 daemon: recognize hidden request argumentsBrandon Williams, Sep 26, 2017
  66. Junio C HamanoSep 27, 2017
  67. Brandon WilliamsSep 27, 2017
  68. Brandon WilliamsSep 28, 2017
  69. 00/10 protocol transitionBrandon Williams, Oct 3, 2017
  70. 04/10 daemon: recognize hidden request argumentsBrandon Williams, Oct 3, 2017
  71. Jonathan TanOct 10, 2017
  72. Brandon WilliamsOct 13, 2017
  73. 03/10 protocol: introduce protocol extention mechanismsBrandon Williams, Oct 3, 2017
  74. Simon RuderichOct 6, 2017
  75. Junio C HamanoOct 6, 2017
  76. Martin ÅgrenOct 6, 2017
  77. Junio C HamanoOct 6, 2017
  78. Martin ÅgrenOct 6, 2017
  79. Stefan BellerOct 6, 2017
  80. Martin ÅgrenOct 8, 2017
  81. Brandon WilliamsOct 10, 2017
  82. Jonathan NiederOct 10, 2017
  83. Stefan BellerOct 10, 2017
  84. Junio C HamanoOct 11, 2017
  85. Brandon WilliamsOct 13, 2017
  86. Martin ÅgrenOct 9, 2017
  87. Jonathan TanOct 10, 2017
  88. 02/10 pkt-line: add packet_write functionBrandon Williams, Oct 3, 2017
  89. Jonathan TanOct 10, 2017
  90. 05/10 upload-pack, receive-pack: introduce protocol version 1Brandon Williams, Oct 3, 2017
  91. Jonathan TanOct 10, 2017
  92. Brandon WilliamsOct 13, 2017
  93. 01/10 connect: in ref advertisement, shallows are lastBrandon Williams, Oct 3, 2017
  94. Jonathan TanOct 10, 2017
  95. 09/10 i5700: add interop test for protocol transitionBrandon Williams, Oct 3, 2017
  96. 08/10 http: tell server that the client understands v1Brandon Williams, Oct 3, 2017
  97. 10/10 ssh: introduce a 'simple' ssh variantBrandon Williams, Oct 3, 2017
  98. Jonathan NiederOct 3, 2017
  99. Brandon WilliamsOct 16, 2017
  100. 0/5 Coping with unrecognized ssh wrapper scripts in GIT_SSHJonathan Nieder, Oct 23, 2017
  101. 1/5 connect: split git:// setup into a separate functionJonathan Nieder, Oct 23, 2017
  102. Stefan BellerOct 23, 2017
  103. diff: add option to ignore whitespaces for move detection onlyStefan Beller, Oct 24, 2017
  104. Brandon WilliamsOct 24, 2017
  105. Junio C HamanoOct 25, 2017
  106. Junio C HamanoOct 25, 2017
  107. Brandon WilliamsOct 25, 2017
  108. Junio C HamanoOct 24, 2017
  109. Stefan BellerOct 24, 2017
  110. 2/5 connect: split ssh command line options into separate functionJonathan Nieder, Oct 23, 2017
  111. Stefan BellerOct 23, 2017
  112. 3/5 ssh: 'auto' variant to select between 'ssh' and 'simple'Jonathan Nieder, Oct 23, 2017
  113. Jonathan TanOct 23, 2017
  114. Jonathan NiederOct 23, 2017
  115. Brandon WilliamsOct 23, 2017
  116. Jonathan TanOct 23, 2017
  117. 0/5 Coping with unrecognized ssh wrapper scripts in GIT_SSHJonathan Nieder, Oct 23, 2017
  118. 1/5 connect: split git:// setup into a separate functionJonathan Nieder, Oct 23, 2017
  119. Junio C HamanoOct 24, 2017
  120. Jonathan NiederNov 15, 2017
  121. Junio C HamanoNov 17, 2017
  122. 2/5 connect: split ssh command line options into separate functionJonathan Nieder, Oct 23, 2017
  123. Junio C HamanoOct 24, 2017
  124. 3/5 ssh: 'auto' variant to select between 'ssh' and 'simple'Jonathan Nieder, Oct 23, 2017
  125. Brandon WilliamsOct 23, 2017
  126. Stefan BellerOct 23, 2017
  127. 4/5 ssh: 'simple' variant does not support -4/-6Jonathan Nieder, Oct 23, 2017
  128. 5/5 ssh: 'simple' variant does not support --portJonathan Nieder, Oct 23, 2017
  129. Junio C HamanoOct 24, 2017
  130. Jonathan NiederOct 23, 2017
  131. Stefan BellerOct 23, 2017
  132. Jonathan NiederOct 23, 2017
  133. Junio C HamanoOct 24, 2017
  134. Johannes SchindelinOct 25, 2017
  135. Stefan BellerOct 25, 2017
  136. Jonathan NiederOct 25, 2017
  137. Junio C HamanoOct 30, 2017
  138. Johannes SchindelinOct 30, 2017
  139. 4/5 ssh: 'simple' variant does not support -4/-6Jonathan Nieder, Oct 23, 2017
  140. 5/5 ssh: 'simple' variant does not support --portJonathan Nieder, Oct 23, 2017
  141. Stefan BellerOct 23, 2017
  142. 07/10 connect: tell server that the client understands v1Brandon Williams, Oct 3, 2017
  143. Jonathan TanOct 10, 2017
  144. Brandon WilliamsOct 13, 2017
  145. 06/10 connect: teach client to recognize v1 server responseBrandon Williams, Oct 3, 2017
  146. Junio C HamanoOct 4, 2017
  147. Documentation: document Extra ParametersJonathan Tan, Oct 10, 2017
  148. Brandon WilliamsOct 13, 2017
  149. 00/11 protocol transitionBrandon Williams, Oct 16, 2017
  150. 01/11 connect: in ref advertisement, shallows are lastBrandon Williams, Oct 16, 2017
  151. 02/11 pkt-line: add packet_write functionBrandon Williams, Oct 16, 2017
  152. 03/11 protocol: introduce protocol extension mechanismsBrandon Williams, Oct 16, 2017
  153. Kevin DaudtOct 16, 2017
  154. 06/11 connect: teach client to recognize v1 server responseBrandon Williams, Oct 16, 2017
  155. 04/11 daemon: recognize hidden request argumentsBrandon Williams, Oct 16, 2017
  156. 09/11 i5700: add interop test for protocol transitionBrandon Williams, Oct 16, 2017
  157. 08/11 http: tell server that the client understands v1Brandon Williams, Oct 16, 2017
  158. 05/11 upload-pack, receive-pack: introduce protocol version 1Brandon Williams, Oct 16, 2017
  159. 07/11 connect: tell server that the client understands v1Brandon Williams, Oct 16, 2017
  160. 10/11 ssh: introduce a 'simple' ssh variantBrandon Williams, Oct 16, 2017
  161. 11/11 Documentation: document Extra ParametersBrandon Williams, Oct 16, 2017

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.