connect: teach client to recognize v1 server response

Teach a client to recognize that a server understands protocol v1 by
looking at the first pkt-line the server sends in response.  This is
done by looking for the response "version 1" send by upload-pack or
receive-pack.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Brandon Williams 2017-10-16 10:55:27 -07:00 committed by Junio C Hamano
parent aa9bab29b8
commit 2609043da0
1 changed files with 26 additions and 4 deletions

View File

@ -12,6 +12,7 @@
#include "sha1-array.h" #include "sha1-array.h"
#include "transport.h" #include "transport.h"
#include "strbuf.h" #include "strbuf.h"
#include "protocol.h"


static char *server_capabilities; static char *server_capabilities;
static const char *parse_feature_value(const char *, const char *, int *); static const char *parse_feature_value(const char *, const char *, int *);
@ -129,9 +130,23 @@ static int read_remote_ref(int in, char **src_buf, size_t *src_len,
return len; return len;
} }


#define EXPECTING_FIRST_REF 0 #define EXPECTING_PROTOCOL_VERSION 0
#define EXPECTING_REF 1 #define EXPECTING_FIRST_REF 1
#define EXPECTING_SHALLOW 2 #define EXPECTING_REF 2
#define EXPECTING_SHALLOW 3

/* Returns 1 if packet_buffer is a protocol version pkt-line, 0 otherwise. */
static int process_protocol_version(void)
{
switch (determine_protocol_version_client(packet_buffer)) {
case protocol_v1:
return 1;
case protocol_v0:
return 0;
default:
die("server is speaking an unknown protocol");
}
}


static void process_capabilities(int *len) static void process_capabilities(int *len)
{ {
@ -224,12 +239,19 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
*/ */
int responded = 0; int responded = 0;
int len; int len;
int state = EXPECTING_FIRST_REF; int state = EXPECTING_PROTOCOL_VERSION;


*list = NULL; *list = NULL;


while ((len = read_remote_ref(in, &src_buf, &src_len, &responded))) { while ((len = read_remote_ref(in, &src_buf, &src_len, &responded))) {
switch (state) { switch (state) {
case EXPECTING_PROTOCOL_VERSION:
if (process_protocol_version()) {
state = EXPECTING_FIRST_REF;
break;
}
state = EXPECTING_FIRST_REF;
/* fallthrough */
case EXPECTING_FIRST_REF: case EXPECTING_FIRST_REF:
process_capabilities(&len); process_capabilities(&len);
if (process_dummy_ref()) { if (process_dummy_ref()) {