Skip to content

Commit d69c7a7

Browse files
committed
transport: transports understand oid type
Teach the smart transport more about oid types, instead of assuming SHA1.
1 parent 72139ef commit d69c7a7

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed

src/libgit2/transports/smart_pkt.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static int ack_pkt(
5353
git_pkt_ack *pkt;
5454
size_t oid_hexsize = git_oid_hexsize(data->oid_type);
5555

56+
GIT_ASSERT(data && data->oid_type);
57+
5658
pkt = git__calloc(1, sizeof(git_pkt_ack));
5759
GIT_ERROR_CHECK_ALLOC(pkt);
5860
pkt->type = GIT_PKT_ACK;
@@ -450,6 +452,8 @@ static int shallow_pkt(
450452
git_pkt_shallow *pkt;
451453
size_t oid_hexsize = git_oid_hexsize(data->oid_type);
452454

455+
GIT_ASSERT(data && data->oid_type);
456+
453457
pkt = git__calloc(1, sizeof(git_pkt_shallow));
454458
GIT_ERROR_CHECK_ALLOC(pkt);
455459

@@ -487,6 +491,8 @@ static int unshallow_pkt(
487491
git_pkt_shallow *pkt;
488492
size_t oid_hexsize = git_oid_hexsize(data->oid_type);
489493

494+
GIT_ASSERT(data && data->oid_type);
495+
490496
pkt = git__calloc(1, sizeof(git_pkt_shallow));
491497
GIT_ERROR_CHECK_ALLOC(pkt);
492498

src/libgit2/transports/smart_protocol.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,20 @@ int git_smart__detect_caps(
256256
return 0;
257257
}
258258

259-
static int recv_pkt(git_pkt **out_pkt, git_pkt_type *out_type, gitno_buffer *buf)
259+
static int recv_pkt(
260+
git_pkt **out_pkt,
261+
git_pkt_type *out_type,
262+
transport_smart *t,
263+
gitno_buffer *buf)
260264
{
261265
const char *ptr = buf->data, *line_end = ptr;
262266
git_pkt *pkt = NULL;
263267
git_pkt_parse_data pkt_parse_data = { 0 };
264268
int error = 0, ret;
265269

270+
pkt_parse_data.oid_type = t->owner->repo->oid_type;
271+
pkt_parse_data.seen_capabilities = 1;
272+
266273
do {
267274
if (buf->offset > 0)
268275
error = git_pkt_parse_line(&pkt, &line_end, ptr, buf->offset, &pkt_parse_data);
@@ -303,7 +310,7 @@ static int store_common(transport_smart *t)
303310
int error;
304311

305312
do {
306-
if ((error = recv_pkt(&pkt, NULL, buf)) < 0)
313+
if ((error = recv_pkt(&pkt, NULL, t, buf)) < 0)
307314
return error;
308315

309316
if (pkt->type != GIT_PKT_ACK) {
@@ -320,7 +327,7 @@ static int store_common(transport_smart *t)
320327
return 0;
321328
}
322329

323-
static int wait_while_ack(gitno_buffer *buf)
330+
static int wait_while_ack(transport_smart *t, gitno_buffer *buf)
324331
{
325332
int error;
326333
git_pkt *pkt = NULL;
@@ -329,7 +336,7 @@ static int wait_while_ack(gitno_buffer *buf)
329336
while (1) {
330337
git_pkt_free(pkt);
331338

332-
if ((error = recv_pkt(&pkt, NULL, buf)) < 0)
339+
if ((error = recv_pkt(&pkt, NULL, t, buf)) < 0)
333340
return error;
334341

335342
if (pkt->type == GIT_PKT_NAK)
@@ -400,8 +407,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
400407
if ((error = git_smart__negotiation_step(&t->parent, data.ptr, data.size)) < 0)
401408
goto on_error;
402409

403-
while ((error = recv_pkt((git_pkt **)&pkt, NULL, buf)) == 0) {
404-
410+
while ((error = recv_pkt((git_pkt **)&pkt, NULL, t, buf)) == 0) {
405411
if (pkt->type == GIT_PKT_SHALLOW) {
406412
git_shallowarray_add(wants->shallow_roots, &pkt->oid);
407413
} else if (pkt->type == GIT_PKT_UNSHALLOW) {
@@ -463,7 +469,7 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
463469
if ((error = store_common(t)) < 0)
464470
goto on_error;
465471
} else {
466-
if ((error = recv_pkt(NULL, &pkt_type, buf)) < 0)
472+
if ((error = recv_pkt(NULL, &pkt_type, t, buf)) < 0)
467473
goto on_error;
468474

469475
if (pkt_type == GIT_PKT_ACK) {
@@ -535,15 +541,15 @@ int git_smart__negotiate_fetch(git_transport *transport, git_repository *repo, c
535541

536542
/* Now let's eat up whatever the server gives us */
537543
if (!t->caps.multi_ack && !t->caps.multi_ack_detailed) {
538-
if ((error = recv_pkt(NULL, &pkt_type, buf)) < 0)
544+
if ((error = recv_pkt(NULL, &pkt_type, t, buf)) < 0)
539545
return error;
540546

541547
if (pkt_type != GIT_PKT_ACK && pkt_type != GIT_PKT_NAK) {
542548
git_error_set(GIT_ERROR_NET, "unexpected pkt type");
543549
return -1;
544550
}
545551
} else {
546-
error = wait_while_ack(buf);
552+
error = wait_while_ack(t, buf);
547553
}
548554

549555
return error;
@@ -659,7 +665,7 @@ int git_smart__download_pack(
659665
goto done;
660666
}
661667

662-
if ((error = recv_pkt(&pkt, NULL, buf)) >= 0) {
668+
if ((error = recv_pkt(&pkt, NULL, t, buf)) >= 0) {
663669
/* Check cancellation after network call */
664670
if (t->cancelled.val) {
665671
git_error_clear();

tests/libgit2/transports/smart/packet.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static void assert_data_pkt_parses(const char *line, const char *expected_data,
2525
size_t linelen = strlen(line) + 1;
2626
const char *endptr;
2727
git_pkt_data *pkt;
28-
git_pkt_parse_data pkt_parse_data = { 0 };
28+
git_pkt_parse_data pkt_parse_data = { 1, GIT_OID_SHA1 };
2929

3030
cl_git_pass(git_pkt_parse_line((git_pkt **) &pkt, &endptr, line, linelen, &pkt_parse_data));
3131
cl_assert_equal_i(pkt->type, GIT_PKT_DATA);
@@ -71,7 +71,7 @@ static void assert_ack_parses(const char *line, const char *expected_oid, enum g
7171
const char *endptr;
7272
git_pkt_ack *pkt;
7373
git_oid oid;
74-
git_pkt_parse_data pkt_parse_data = { 0 };
74+
git_pkt_parse_data pkt_parse_data = { 1, GIT_OID_SHA1 };
7575

7676
cl_git_pass(git_oid__fromstr(&oid, expected_oid, GIT_OID_SHA1));
7777

0 commit comments

Comments
 (0)