
Handle allocation failures in `reftable_new_writer()`. Adapt the function to return an error code to return such failures. While at it, rename it to match our code style as we have to touch up every callsite anyway. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
96 lines
2.1 KiB
C
96 lines
2.1 KiB
C
#include "lib-reftable.h"
|
|
#include "test-lib.h"
|
|
#include "reftable/constants.h"
|
|
#include "reftable/writer.h"
|
|
|
|
void t_reftable_set_hash(uint8_t *p, int i, uint32_t id)
|
|
{
|
|
memset(p, (uint8_t)i, hash_size(id));
|
|
}
|
|
|
|
static ssize_t strbuf_writer_write(void *b, const void *data, size_t sz)
|
|
{
|
|
strbuf_add(b, data, sz);
|
|
return sz;
|
|
}
|
|
|
|
static int strbuf_writer_flush(void *arg UNUSED)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
struct reftable_writer *t_reftable_strbuf_writer(struct strbuf *buf,
|
|
struct reftable_write_options *opts)
|
|
{
|
|
struct reftable_writer *writer;
|
|
int ret = reftable_writer_new(&writer, &strbuf_writer_write, &strbuf_writer_flush,
|
|
buf, opts);
|
|
check(!ret);
|
|
return writer;
|
|
}
|
|
|
|
void t_reftable_write_to_buf(struct strbuf *buf,
|
|
struct reftable_ref_record *refs,
|
|
size_t nrefs,
|
|
struct reftable_log_record *logs,
|
|
size_t nlogs,
|
|
struct reftable_write_options *_opts)
|
|
{
|
|
struct reftable_write_options opts = { 0 };
|
|
const struct reftable_stats *stats;
|
|
struct reftable_writer *writer;
|
|
uint64_t min = 0xffffffff;
|
|
uint64_t max = 0;
|
|
int ret;
|
|
|
|
if (_opts)
|
|
opts = *_opts;
|
|
|
|
for (size_t i = 0; i < nrefs; i++) {
|
|
uint64_t ui = refs[i].update_index;
|
|
if (ui > max)
|
|
max = ui;
|
|
if (ui < min)
|
|
min = ui;
|
|
}
|
|
for (size_t i = 0; i < nlogs; i++) {
|
|
uint64_t ui = logs[i].update_index;
|
|
if (ui > max)
|
|
max = ui;
|
|
if (ui < min)
|
|
min = ui;
|
|
}
|
|
|
|
writer = t_reftable_strbuf_writer(buf, &opts);
|
|
reftable_writer_set_limits(writer, min, max);
|
|
|
|
if (nrefs) {
|
|
ret = reftable_writer_add_refs(writer, refs, nrefs);
|
|
check_int(ret, ==, 0);
|
|
}
|
|
|
|
if (nlogs) {
|
|
ret = reftable_writer_add_logs(writer, logs, nlogs);
|
|
check_int(ret, ==, 0);
|
|
}
|
|
|
|
ret = reftable_writer_close(writer);
|
|
check_int(ret, ==, 0);
|
|
|
|
stats = reftable_writer_stats(writer);
|
|
for (size_t i = 0; i < stats->ref_stats.blocks; i++) {
|
|
size_t off = i * (opts.block_size ? opts.block_size
|
|
: DEFAULT_BLOCK_SIZE);
|
|
if (!off)
|
|
off = header_size(opts.hash_id == GIT_SHA256_FORMAT_ID ? 2 : 1);
|
|
check_char(buf->buf[off], ==, 'r');
|
|
}
|
|
|
|
if (nrefs)
|
|
check_int(stats->ref_stats.blocks, >, 0);
|
|
if (nlogs)
|
|
check_int(stats->log_stats.blocks, >, 0);
|
|
|
|
reftable_writer_free(writer);
|
|
}
|