| #include "unit-test.h" | |
| #include "lib-reftable.h" | |
| #include "hex.h" | |
| #include "parse-options.h" | |
| #include "reftable/constants.h" | |
| #include "reftable/writer.h" | |
| #include "strbuf.h" | |
| #include "string-list.h" | |
| #include "strvec.h" | |
| void cl_reftable_set_hash(uint8_t *p, int i, enum reftable_hash 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 *cl_reftable_strbuf_writer(struct reftable_buf *buf, | |
| struct reftable_write_options *opts) | |
| { | |
| struct reftable_writer *writer; | |
| int ret = reftable_writer_new(&writer, &strbuf_writer_write, &strbuf_writer_flush, | |
| buf, opts); | |
| cl_assert(!ret); | |
| return writer; | |
| } | |
| void cl_reftable_write_to_buf(struct reftable_buf *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 = cl_reftable_strbuf_writer(buf, &opts); | |
| ret = reftable_writer_set_limits(writer, min, max); | |
| cl_assert(!ret); | |
| if (nrefs) { | |
| ret = reftable_writer_add_refs(writer, refs, nrefs); | |
| cl_assert_equal_i(ret, 0); | |
| } | |
| if (nlogs) { | |
| ret = reftable_writer_add_logs(writer, logs, nlogs); | |
| cl_assert_equal_i(ret, 0); | |
| } | |
| ret = reftable_writer_close(writer); | |
| cl_assert_equal_i(ret, 0); | |
| stats = reftable_writer_stats(writer); | |
| for (size_t i = 0; i < (size_t)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 == REFTABLE_HASH_SHA256 ? 2 : 1); | |
| cl_assert(buf->buf[off] == 'r'); | |
| } | |
| if (nrefs) | |
| cl_assert(stats->ref_stats.blocks > 0); | |
| if (nlogs) | |
| cl_assert(stats->log_stats.blocks > 0); | |
| reftable_writer_free(writer); | |
| } |