374
375
static int reftable_ref_record_decode(void *rec, struct strbuf key,
376
uint8_t val_type, struct string_view in,
377
- int hash_size)
377
+ int hash_size, struct strbuf *scratch)
378
{
379
struct reftable_ref_record *r = rec;
380
struct string_view start = in;
425
break;
426
427
case REFTABLE_REF_SYMREF: {
428
- struct strbuf dest = STRBUF_INIT;
429
- int n = decode_string(&dest, in);
428
+ int n = decode_string(scratch, in);
429
if (n < 0) {
430
return -1;
431
}
432
string_view_consume(&in, n);
434
- r->value.symref = dest.buf;
433
+ r->value.symref = strbuf_detach(scratch, NULL);
434
} break;
435
436
case REFTABLE_REF_DELETION:
578
579
static int reftable_obj_record_decode(void *rec, struct strbuf key,
580
uint8_t val_type, struct string_view in,
582
- int hash_size)
581
+ int hash_size, struct strbuf *scratch UNUSED)
582
{
583
struct string_view start = in;
584
struct reftable_obj_record *r = rec;
848
849
static int reftable_log_record_decode(void *rec, struct strbuf key,
850
uint8_t val_type, struct string_view in,
852
- int hash_size)
851
+ int hash_size, struct strbuf *scratch)
852
{
853
struct string_view start = in;
854
struct reftable_log_record *r = rec;
855
uint64_t max = 0;
856
uint64_t ts = 0;
858
- struct strbuf dest = STRBUF_INIT;
857
int n;
858
859
if (key.len <= 9 || key.buf[key.len - 9] != 0)
890
891
string_view_consume(&in, 2 * hash_size);
892
895
- n = decode_string(&dest, in);
893
+ n = decode_string(scratch, in);
894
if (n < 0)
895
goto done;
896
string_view_consume(&in, n);
902
* skip copying over the name in case it's accurate already.
903
*/
904
if (!r->value.update.name ||
907
- strcmp(r->value.update.name, dest.buf)) {
905
+ strcmp(r->value.update.name, scratch->buf)) {
906
r->value.update.name =
909
- reftable_realloc(r->value.update.name, dest.len + 1);
910
- memcpy(r->value.update.name, dest.buf, dest.len);
911
- r->value.update.name[dest.len] = 0;
907
+ reftable_realloc(r->value.update.name, scratch->len + 1);
908
+ memcpy(r->value.update.name, scratch->buf, scratch->len);
909
+ r->value.update.name[scratch->len] = 0;
910
}
911
914
- strbuf_reset(&dest);
915
- n = decode_string(&dest, in);
912
+ n = decode_string(scratch, in);
913
if (n < 0)
914
goto done;
915
string_view_consume(&in, n);
916
917
/* Same as above, but for the reflog email. */
918
if (!r->value.update.email ||
922
- strcmp(r->value.update.email, dest.buf)) {
919
+ strcmp(r->value.update.email, scratch->buf)) {
920
r->value.update.email =
924
- reftable_realloc(r->value.update.email, dest.len + 1);
925
- memcpy(r->value.update.email, dest.buf, dest.len);
926
- r->value.update.email[dest.len] = 0;
921
+ reftable_realloc(r->value.update.email, scratch->len + 1);
922
+ memcpy(r->value.update.email, scratch->buf, scratch->len);
923
+ r->value.update.email[scratch->len] = 0;
924
}
925
926
ts = 0;
935
r->value.update.tz_offset = get_be16(in.buf);
936
string_view_consume(&in, 2);
937
941
- strbuf_reset(&dest);
942
- n = decode_string(&dest, in);
938
+ n = decode_string(scratch, in);
939
if (n < 0)
940
goto done;
941
string_view_consume(&in, n);
942
947
- REFTABLE_ALLOC_GROW(r->value.update.message, dest.len + 1,
943
+ REFTABLE_ALLOC_GROW(r->value.update.message, scratch->len + 1,
944
r->value.update.message_cap);
949
- memcpy(r->value.update.message, dest.buf, dest.len);
950
- r->value.update.message[dest.len] = 0;
945
+ memcpy(r->value.update.message, scratch->buf, scratch->len);
946
+ r->value.update.message[scratch->len] = 0;
947
952
- strbuf_release(&dest);
948
return start.len - in.len;
949
950
done:
956
- strbuf_release(&dest);
951
return REFTABLE_FORMAT_ERROR;
952
}
953
1087
1088
static int reftable_index_record_decode(void *rec, struct strbuf key,
1089
uint8_t val_type, struct string_view in,
1096
- int hash_size)
1090
+ int hash_size, struct strbuf *scratch UNUSED)
1091
{
1092
struct string_view start = in;
1093
struct reftable_index_record *r = rec;
1168
}
1169
1170
int reftable_record_decode(struct reftable_record *rec, struct strbuf key,
1177
- uint8_t extra, struct string_view src, int hash_size)
1171
+ uint8_t extra, struct string_view src, int hash_size,
1172
+ struct strbuf *scratch)
1173
{
1174
return reftable_record_vtable(rec)->decode(reftable_record_data(rec),
1180
- key, extra, src, hash_size);
1175
+ key, extra, src, hash_size,
1176
+ scratch);
1177
}
1178
1179
void reftable_record_release(struct reftable_record *rec)