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

Re: [PATCH v2 7/9] connect: tell server that the client understands v1

From
BWBrandon Williams <bmwill@google.com>
Date
Sep 28, 2017, 22:20 UTC
Message-ID
<20170928222009.GD177031@google.com>
In-Reply-To
<xmqqk20k64r4.fsf@gitster.mtv.corp.google.com>
On 09/27, Junio C Hamano wrote:
Show 33 quoted lines
> Brandon Williams <bmwill@google.com> writes:
> 
> > Teach the connection logic to tell a serve that it understands protocol
> > v1.  This is done in 2 different ways for the built in protocols.
> >
> > 1. git://
> >    A normal request is structured as "command path/to/repo\0host=..\0"
> >    and due to a bug in an old version of git-daemon 73bb33a94 (daemon:
> >    Strictly parse the "extra arg" part of the command, 2009-06-04) we
> >    aren't able to place any extra args (separated by NULs) besides the
> >    host.  In order to get around this limitation put protocol version
> >    information after a second NUL byte so the request is structured
> >    like: "command path/to/repo\0host=..\0\0version=1\0".  git-daemon can
> >    then parse out the version number and set GIT_PROTOCOL.
> 
> Same question as a previous step, wrt the cited commit.  It reads as
> if we are saying that the commit introduced a bug and left it there,
> that we cannot use \0host=..\0version=..\0other=..\0 until that bug
> is fixed, and that in the meantime we use \0host=..\0\0version=.. as
> a workaround, but that reading leaves readers wondering if we want
> to eventually drop this double-NUL workaround.  I am guessing that
> we want to declare that the current protocol has a glitch that
> prevents us to use \0host=..\0version=..\0 but we accept that and
> plan to keep it that way, and we'll use the double-NUL for anything
> other than host from now on, as it is compatible with the current
> version of Git before this patch (the extras are safely ignored),
> but then it still leaves readers wonder if the mention of the
> old commit from 2009 means that this double-NUL would not even work
> if the other end is running a version of Git before that commit, or
> we are safe to talk with versions of Git even older than that.
> 
> I do not think it is a showstopper if we did not work with v1.6.4,
> but it still needs to be clarified.

I wrote an updated commit msg for the daemon change, I can make a similar change here. And this mechanism shouldn't cause any issues with both the pre and post 73bb33a94 git-daemon servers.

Show 11 quoted lines
> 
> > 2. ssh://, file://
> >    Set GIT_PROTOCOL envvar with the desired protocol version.  The
> >    envvar can be sent across ssh by using '-o SendEnv=GIT_PROTOCOL' and
> >    having the server whitelist this envvar.
> 
> OpenSSH lets us do this, but I do not know how well this works with
> other implementations of SSH clients.  The log message perhaps needs
> to ask for volunteers to check if it is OK with the implementations
> they use, and offer conditional code (just like we have for putty
> and plink customizations) otherwise.
I'll make a comment indicating that
Show 44 quoted lines
> 
> Other than that, the code changes looked good.
> 
> > diff --git a/t/t5700-protocol-v1.sh b/t/t5700-protocol-v1.sh
> > new file mode 100755
> > index 000000000..1988bbce6
> > --- /dev/null
> > +++ b/t/t5700-protocol-v1.sh
> > @@ -0,0 +1,223 @@
> > +#!/bin/sh
> > +
> > +test_description='test git wire-protocol transition'
> > +
> > +TEST_NO_CREATE_REPO=1
> > +
> > +. ./test-lib.sh
> > +
> > +# Test protocol v1 with 'git://' transport
> > +#
> > +. "$TEST_DIRECTORY"/lib-git-daemon.sh
> > +start_git_daemon --export-all --enable=receive-pack
> > +daemon_parent=$GIT_DAEMON_DOCUMENT_ROOT_PATH/parent
> > +
> > +test_expect_success 'create repo to be served by git-daemon' '
> > +	git init "$daemon_parent" &&
> > +	test_commit -C "$daemon_parent" one
> > +'
> > +
> > +test_expect_success 'clone with git:// using protocol v1' '
> > +	GIT_TRACE_PACKET=1 git -c protocol.version=1 \
> > +		clone "$GIT_DAEMON_URL/parent" daemon_child 2>log &&
> > +
> > +	git -C daemon_child log -1 --format=%s >actual &&
> > +	git -C "$daemon_parent" log -1 --format=%s >expect &&
> > +	test_cmp expect actual &&
> > +
> > +	# Client requested to use protocol v1
> > +	grep "version=1" log &&
> > +	# Server responded using protocol v1
> > +	grep "clone< version 1" log
> 
> This looked a bit strange to check "clone< version 1" for one
> direction, but did not check "$something> version 1" for the other
> direction.  Doesn't "version=1" end up producing 2 hits?

I think you discovered this in your next email but the "version=1" check is to check for the request sent to git-daemon, the "command path/to/repo\0host=blah\0\0version=1\0" one. While the "clone< version 1" check is to make sure that the server responded with the correct version.

Show 24 quoted lines
> 
> Not a complaint, but wondering if we can write it in such a way that
> does not have to make readers wonder.
> 
> > +'
> > +
> > +test_expect_success 'fetch with git:// using protocol v1' '
> > +	test_commit -C "$daemon_parent" two &&
> > +
> > +	GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
> > +		fetch 2>log &&
> > +
> > +	git -C daemon_child log -1 --format=%s FETCH_HEAD >actual &&
> > +	git -C "$daemon_parent" log -1 --format=%s >expect &&
> > +	test_cmp expect actual &&
> 
> OK.  So the origin repository gained one commit on the 'master'
> branch (and a tag 'two').  By fetching, but not pulling, our
> 'master' would not advance, and that is where check on FETCH_HEAD
> comes from.  I suspect that the tag 'two' is also auto-followed with
> this operation and would be in FETCH_HEAD; is that something we want
> to check?  Alternatively, the "actual" log may want to see what the
> remote tracking branch for their 'master' has---then we do not have
> to worry about "FETCH_HEAD has two refs---which one are we checking?"
Yeah I can do that instead if you would prefer.
Show 22 quoted lines
> 
> > +
> > +	# Client requested to use protocol v1
> > +	grep "version=1" log &&
> > +	# Server responded using protocol v1
> > +	grep "fetch< version 1" log
> > +'
> 
> Same "version=1" vs "fetch< version 1" strangeness appears here.
> 
> > +test_expect_success 'pull with git:// using protocol v1' '
> > +	GIT_TRACE_PACKET=1 git -C daemon_child -c protocol.version=1 \
> > +		pull 2>log &&
> > +
> > +	git -C daemon_child log -1 --format=%s >actual &&
> > +	git -C "$daemon_parent" log -1 --format=%s >expect &&
> > +	test_cmp expect actual &&
> 
> Here we can check our 'master', as we pulled their 'master' into it.
> What is this testing, though?  The fact that protocol.version=1
> given via "git -c var=val" mechanism is propagated to the underlying
> fetch?

Yeah, i guess we could realistically drop either the fetch or pull test as they essentially do the same thing. I was just being overly cautious.

Show 19 quoted lines
> 
> > +	# Client requested to use protocol v1
> > +	grep "version=1" log &&
> > +	# Server responded using protocol v1
> > +	grep "fetch< version 1" log
> > +'
> > +
> > +test_expect_success 'push with git:// using protocol v1' '
> > +	test_commit -C daemon_child three &&
> > +
> > +	# Since the repository being served isnt bare we need to push to
> > +	# another branch explicitly to avoid mangling the master branch
> 
> The other end avoids mangling the master just fine without us doing
> anything special ;-).  You are pushing to another branch because you
> cannot push into a branch that is currently checked out.
> 
> 	# Push to another branch, as the target repository has the
> 	# master branch checked out and we cannot push into it.
Sounds good I'll change that.
Show 38 quoted lines
> 
> perhaps?
> 
> The tests for file:// looked identical, so the same set of comments
> apply.
> 
> > +# Test protocol v1 with 'ssh://' transport
> > +#
> > +test_expect_success 'setup ssh wrapper' '
> > +	GIT_SSH="$GIT_BUILD_DIR/t/helper/test-fake-ssh$X" &&
> > +	export GIT_SSH &&
> > +	export TRASH_DIRECTORY &&
> > +	>"$TRASH_DIRECTORY"/ssh-output
> > +'
> > +
> > +expect_ssh () {
> > +	test_when_finished '(cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output)' &&
> > +	echo "ssh: -o SendEnv=GIT_PROTOCOL myhost $1 '$PWD/ssh_parent'" >"$TRASH_DIRECTORY/ssh-expect" &&
> > +	(cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output)
> > +}
> > +
> > +test_expect_success 'create repo to be served by ssh:// transport' '
> > +	git init ssh_parent &&
> > +	test_commit -C ssh_parent one
> > +'
> > +
> > +test_expect_success 'clone with ssh:// using protocol v1' '
> > +	GIT_TRACE_PACKET=1 git -c protocol.version=1 \
> > +		clone "ssh://myhost:$(pwd)/ssh_parent" ssh_child 2>log &&
> 
> Hmm, this is a fun one, as we deliberately make $(pwd) to have
> whitespace in the test setup.  I am impressed/kinda surprised that
> this works ;-)
> 
> Other than that, these also look more or less identical to file://
> and git:// tests, so the same set of comments apply.
> 
> Overall very nicely done.
Thanks! :D
> 
> Thanks.
-- 
Brandon Williams
Previous: Brandon WilliamsNext: Brandon Williams
Message 57 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.