upload-pack: implement ref-in-want
Currently, while performing packfile negotiation, clients are only allowed to specify their desired objects using object ids. This causes a vulnerability to failure when an object turns non-existent during negotiation, which may happen if, for example, the desired repository is provided by multiple Git servers in a load-balancing arrangement and there exists replication delay. In order to eliminate this vulnerability, implement the ref-in-want feature for the 'fetch' command in protocol version 2. This feature enables the 'fetch' command to support requests in the form of ref names through a new "want-ref <ref>" parameter. At the conclusion of negotiation, the server will send a list of all of the wanted references (as provided by "want-ref" lines) in addition to the generated packfile. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
4bcd37d3bc
commit
516e2b76bd
@ -299,12 +299,21 @@ included in the client's request:
|
||||
for use with partial clone and partial fetch operations. See
|
||||
`rev-list` for possible "filter-spec" values.
|
||||
|
||||
If the 'ref-in-want' feature is advertised, the following argument can
|
||||
be included in the client's request as well as the potential addition of
|
||||
the 'wanted-refs' section in the server's response as explained below.
|
||||
|
||||
want-ref <ref>
|
||||
Indicates to the server that the client wants to retrieve a
|
||||
particular ref, where <ref> is the full name of a ref on the
|
||||
server.
|
||||
|
||||
The response of `fetch` is broken into a number of sections separated by
|
||||
delimiter packets (0001), with each section beginning with its section
|
||||
header.
|
||||
|
||||
output = *section
|
||||
section = (acknowledgments | shallow-info | packfile)
|
||||
section = (acknowledgments | shallow-info | wanted-refs | packfile)
|
||||
(flush-pkt | delim-pkt)
|
||||
|
||||
acknowledgments = PKT-LINE("acknowledgments" LF)
|
||||
@ -319,6 +328,10 @@ header.
|
||||
shallow = "shallow" SP obj-id
|
||||
unshallow = "unshallow" SP obj-id
|
||||
|
||||
wanted-refs = PKT-LINE("wanted-refs" LF)
|
||||
*PKT-LINE(wanted-ref LF)
|
||||
wanted-ref = obj-id SP refname
|
||||
|
||||
packfile = PKT-LINE("packfile" LF)
|
||||
*PKT-LINE(%x01-03 *%x00-ff)
|
||||
|
||||
@ -379,6 +392,19 @@ header.
|
||||
* This section is only included if a packfile section is also
|
||||
included in the response.
|
||||
|
||||
wanted-refs section
|
||||
* This section is only included if the client has requested a
|
||||
ref using a 'want-ref' line and if a packfile section is also
|
||||
included in the response.
|
||||
|
||||
* Always begins with the section header "wanted-refs".
|
||||
|
||||
* The server will send a ref listing ("<oid> <refname>") for
|
||||
each reference requested using 'want-ref' lines.
|
||||
|
||||
* The server MUST NOT send any refs which were not requested
|
||||
using 'want-ref' lines.
|
||||
|
||||
packfile section
|
||||
* This section is only included if the client has sent 'want'
|
||||
lines in its request and either requested that no more
|
||||
|
Reference in New Issue
Block a user