Merge branch 'dd/upload-pack-stateless-eof'

"git fetch --depth=<n>" over the stateless RPC / smart HTTP
transport handled EOF from the client poorly at the server end.

* dd/upload-pack-stateless-eof:
  upload-pack: allow stateless client EOF just prior to haves
This commit is contained in:
Junio C Hamano 2020-11-18 13:32:51 -08:00
commit d1169be31a
2 changed files with 29 additions and 1 deletions

View file

@ -88,6 +88,23 @@ test_expect_success 'upload-pack fails due to error in pack-objects enumeration'
grep "pack-objects died" output.err
'
test_expect_success 'upload-pack tolerates EOF just after stateless client wants' '
test_commit initial &&
head=$(git rev-parse HEAD) &&
{
packetize "want $head" &&
packetize "shallow $head" &&
packetize "deepen 1" &&
printf "0000"
} >request &&
printf "0000" >expect &&
git upload-pack --stateless-rpc . <request >actual &&
test_cmp expect actual
'
test_expect_success 'create empty repository' '
mkdir foo &&

View file

@ -1344,7 +1344,18 @@ void upload_pack(struct upload_pack_options *options)
PACKET_READ_DIE_ON_ERR_PACKET);
receive_needs(&data, &reader);
if (data.want_obj.nr) {
/*
* An EOF at this exact point in negotiation should be
* acceptable from stateless clients as they will consume the
* shallow list before doing subsequent rpc with haves/etc.
*/
if (data.stateless_rpc)
reader.options |= PACKET_READ_GENTLE_ON_EOF;
if (data.want_obj.nr &&
packet_reader_peek(&reader) != PACKET_READ_EOF) {
reader.options &= ~PACKET_READ_GENTLE_ON_EOF;
get_common_commits(&data, &reader);
create_pack_file(&data, NULL);
}