git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 14/25] reftable: reftable file level tests

From
Han-Wen Nienhuys via GitGitGadget <gitgitgadget@gmail.com>
Date
Aug 16, 2021, 20:17 UTC
Message-ID
<45565bfb9c4bafd4579a78833653907ad42387d2.1629145036.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1054.v2.git.git.1629145036.gitgitgadget@gmail.com>
From: Han-Wen Nienhuys <hanwen@google.com>

With support for reading and writing files in place, we can construct files (in memory) and attempt to read them back.

Because some sections of the format are optional (eg. indices, log entries), we have to exercise this code using multiple sizes of input data

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
---
 Makefile                  |   1 +
 reftable/readwrite_test.c | 651 ++++++++++++++++++++++++++++++++++++++
 reftable/reftable-tests.h |   2 +-
 t/helper/test-reftable.c  |   1 +
 4 files changed, 654 insertions(+), 1 deletion(-)
 create mode 100644 reftable/readwrite_test.c
diff --git a/Makefile b/Makefile
index 5c857989091..5e2ff446894 100644
--- a/Makefile
+++ b/Makefile
@@ -2469,6 +2469,7 @@ REFTABLE_OBJS += reftable/writer.o
 REFTABLE_TEST_OBJS += reftable/basics_test.o
 REFTABLE_TEST_OBJS += reftable/block_test.o
 REFTABLE_TEST_OBJS += reftable/record_test.o
+REFTABLE_TEST_OBJS += reftable/readwrite_test.o
 REFTABLE_TEST_OBJS += reftable/test_framework.o
 REFTABLE_TEST_OBJS += reftable/tree_test.o
 
diff --git a/reftable/readwrite_test.c b/reftable/readwrite_test.c
new file mode 100644
index 00000000000..8ed817f4609
--- /dev/null
+++ b/reftable/readwrite_test.c
@@ -0,0 +1,651 @@
+/*
+Copyright 2020 Google LLC
+
+Use of this source code is governed by a BSD-style
+license that can be found in the LICENSE file or at
+https://developers.google.com/open-source/licenses/bsd
+*/
+
+#include "system.h"
+
+#include "basics.h"
+#include "block.h"
+#include "blocksource.h"
+#include "constants.h"
+#include "reader.h"
+#include "record.h"
+#include "test_framework.h"
+#include "reftable-tests.h"
+#include "reftable-writer.h"
+
+static const int update_index = 5;
+
+static void test_buffer(void)
+{
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_block_source source = { NULL };
+	struct reftable_block out = { NULL };
+	int n;
+	uint8_t in[] = "hello";
+	strbuf_add(&buf, in, sizeof(in));
+	block_source_from_strbuf(&source, &buf);
+	EXPECT(block_source_size(&source) == 6);
+	n = block_source_read_block(&source, &out, 0, sizeof(in));
+	EXPECT(n == sizeof(in));
+	EXPECT(!memcmp(in, out.data, n));
+	reftable_block_done(&out);
+
+	n = block_source_read_block(&source, &out, 1, 2);
+	EXPECT(n == 2);
+	EXPECT(!memcmp(out.data, "el", 2));
+
+	reftable_block_done(&out);
+	block_source_close(&source);
+	strbuf_release(&buf);
+}
+
+static void write_table(char ***names, struct strbuf *buf, int N,
+			int block_size, uint32_t hash_id)
+{
+	struct reftable_write_options opts = {
+		.block_size = block_size,
+		.hash_id = hash_id,
+	};
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, buf, &opts);
+	struct reftable_ref_record ref = { NULL };
+	int i = 0, n;
+	struct reftable_log_record log = { NULL };
+	const struct reftable_stats *stats = NULL;
+	*names = reftable_calloc(sizeof(char *) * (N + 1));
+	reftable_writer_set_limits(w, update_index, update_index);
+	for (i = 0; i < N; i++) {
+		uint8_t hash[GIT_SHA256_RAWSZ] = { 0 };
+		char name[100];
+		int n;
+
+		set_test_hash(hash, i);
+
+		snprintf(name, sizeof(name), "refs/heads/branch%02d", i);
+
+		ref.refname = name;
+		ref.update_index = update_index;
+		ref.value_type = REFTABLE_REF_VAL1;
+		ref.value.val1 = hash;
+		(*names)[i] = xstrdup(name);
+
+		n = reftable_writer_add_ref(w, &ref);
+		EXPECT(n == 0);
+	}
+
+	for (i = 0; i < N; i++) {
+		uint8_t hash[GIT_SHA256_RAWSZ] = { 0 };
+		char name[100];
+		int n;
+
+		set_test_hash(hash, i);
+
+		snprintf(name, sizeof(name), "refs/heads/branch%02d", i);
+
+		log.refname = name;
+		log.update_index = update_index;
+		log.value_type = REFTABLE_LOG_UPDATE;
+		log.update.new_hash = hash;
+		log.update.message = "message";
+
+		n = reftable_writer_add_log(w, &log);
+		EXPECT(n == 0);
+	}
+
+	n = reftable_writer_close(w);
+	EXPECT(n == 0);
+
+	stats = writer_stats(w);
+	for (i = 0; i < stats->ref_stats.blocks; i++) {
+		int off = i * opts.block_size;
+		if (off == 0) {
+			off = header_size((hash_id == GIT_SHA256_FORMAT_ID) ? 2 :
+										  1);
+		}
+		EXPECT(buf->buf[off] == 'r');
+	}
+
+	EXPECT(stats->log_stats.blocks > 0);
+	reftable_writer_free(w);
+}
+
+static void test_log_buffer_size(void)
+{
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_write_options opts = {
+		.block_size = 4096,
+	};
+	int err;
+	int i;
+	struct reftable_log_record log = { .refname = "refs/heads/master",
+					   .update_index = 0xa,
+					   .value_type = REFTABLE_LOG_UPDATE,
+					   .update = {
+						   .name = "Han-Wen Nienhuys",
+						   .email = "hanwen@google.com",
+						   .tz_offset = 100,
+						   .time = 0x5e430672,
+						   .message = "commit: 9\n",
+					   } };
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, &buf, &opts);
+
+	/* This tests buffer extension for log compression. Must use a random
+	   hash, to ensure that the compressed part is larger than the original.
+	*/
+	uint8_t hash1[GIT_SHA1_RAWSZ], hash2[GIT_SHA1_RAWSZ];
+	for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
+		hash1[i] = (uint8_t)(rand() % 256);
+		hash2[i] = (uint8_t)(rand() % 256);
+	}
+	log.update.old_hash = hash1;
+	log.update.new_hash = hash2;
+	reftable_writer_set_limits(w, update_index, update_index);
+	err = reftable_writer_add_log(w, &log);
+	EXPECT_ERR(err);
+	err = reftable_writer_close(w);
+	EXPECT_ERR(err);
+	reftable_writer_free(w);
+	strbuf_release(&buf);
+}
+
+static void test_log_write_read(void)
+{
+	int N = 2;
+	char **names = reftable_calloc(sizeof(char *) * (N + 1));
+	int err;
+	struct reftable_write_options opts = {
+		.block_size = 256,
+	};
+	struct reftable_ref_record ref = { NULL };
+	int i = 0;
+	struct reftable_log_record log = { NULL };
+	int n;
+	struct reftable_iterator it = { NULL };
+	struct reftable_reader rd = { NULL };
+	struct reftable_block_source source = { NULL };
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, &buf, &opts);
+	const struct reftable_stats *stats = NULL;
+	reftable_writer_set_limits(w, 0, N);
+	for (i = 0; i < N; i++) {
+		char name[256];
+		struct reftable_ref_record ref = { NULL };
+		snprintf(name, sizeof(name), "b%02d%0*d", i, 130, 7);
+		names[i] = xstrdup(name);
+		ref.refname = name;
+		ref.update_index = i;
+
+		err = reftable_writer_add_ref(w, &ref);
+		EXPECT_ERR(err);
+	}
+	for (i = 0; i < N; i++) {
+		uint8_t hash1[GIT_SHA1_RAWSZ], hash2[GIT_SHA1_RAWSZ];
+		struct reftable_log_record log = { NULL };
+		set_test_hash(hash1, i);
+		set_test_hash(hash2, i + 1);
+
+		log.refname = names[i];
+		log.update_index = i;
+		log.value_type = REFTABLE_LOG_UPDATE;
+		log.update.old_hash = hash1;
+		log.update.new_hash = hash2;
+
+		err = reftable_writer_add_log(w, &log);
+		EXPECT_ERR(err);
+	}
+
+	n = reftable_writer_close(w);
+	EXPECT(n == 0);
+
+	stats = writer_stats(w);
+	EXPECT(stats->log_stats.blocks > 0);
+	reftable_writer_free(w);
+	w = NULL;
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = init_reader(&rd, &source, "file.log");
+	EXPECT_ERR(err);
+
+	err = reftable_reader_seek_ref(&rd, &it, names[N - 1]);
+	EXPECT_ERR(err);
+
+	err = reftable_iterator_next_ref(&it, &ref);
+	EXPECT_ERR(err);
+
+	/* end of iteration. */
+	err = reftable_iterator_next_ref(&it, &ref);
+	EXPECT(0 < err);
+
+	reftable_iterator_destroy(&it);
+	reftable_ref_record_release(&ref);
+
+	err = reftable_reader_seek_log(&rd, &it, "");
+	EXPECT_ERR(err);
+
+	i = 0;
+	while (1) {
+		int err = reftable_iterator_next_log(&it, &log);
+		if (err > 0) {
+			break;
+		}
+
+		EXPECT_ERR(err);
+		EXPECT_STREQ(names[i], log.refname);
+		EXPECT(i == log.update_index);
+		i++;
+		reftable_log_record_release(&log);
+	}
+
+	EXPECT(i == N);
+	reftable_iterator_destroy(&it);
+
+	/* cleanup. */
+	strbuf_release(&buf);
+	free_names(names);
+	reader_close(&rd);
+}
+
+static void test_table_read_write_sequential(void)
+{
+	char **names;
+	struct strbuf buf = STRBUF_INIT;
+	int N = 50;
+	struct reftable_iterator it = { NULL };
+	struct reftable_block_source source = { NULL };
+	struct reftable_reader rd = { NULL };
+	int err = 0;
+	int j = 0;
+
+	write_table(&names, &buf, N, 256, GIT_SHA1_FORMAT_ID);
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = init_reader(&rd, &source, "file.ref");
+	EXPECT_ERR(err);
+
+	err = reftable_reader_seek_ref(&rd, &it, "");
+	EXPECT_ERR(err);
+
+	while (1) {
+		struct reftable_ref_record ref = { NULL };
+		int r = reftable_iterator_next_ref(&it, &ref);
+		EXPECT(r >= 0);
+		if (r > 0) {
+			break;
+		}
+		EXPECT(0 == strcmp(names[j], ref.refname));
+		EXPECT(update_index == ref.update_index);
+
+		j++;
+		reftable_ref_record_release(&ref);
+	}
+	EXPECT(j == N);
+	reftable_iterator_destroy(&it);
+	strbuf_release(&buf);
+	free_names(names);
+
+	reader_close(&rd);
+}
+
+static void test_table_write_small_table(void)
+{
+	char **names;
+	struct strbuf buf = STRBUF_INIT;
+	int N = 1;
+	write_table(&names, &buf, N, 4096, GIT_SHA1_FORMAT_ID);
+	EXPECT(buf.len < 200);
+	strbuf_release(&buf);
+	free_names(names);
+}
+
+static void test_table_read_api(void)
+{
+	char **names;
+	struct strbuf buf = STRBUF_INIT;
+	int N = 50;
+	struct reftable_reader rd = { NULL };
+	struct reftable_block_source source = { NULL };
+	int err;
+	int i;
+	struct reftable_log_record log = { NULL };
+	struct reftable_iterator it = { NULL };
+
+	write_table(&names, &buf, N, 256, GIT_SHA1_FORMAT_ID);
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = init_reader(&rd, &source, "file.ref");
+	EXPECT_ERR(err);
+
+	err = reftable_reader_seek_ref(&rd, &it, names[0]);
+	EXPECT_ERR(err);
+
+	err = reftable_iterator_next_log(&it, &log);
+	EXPECT(err == REFTABLE_API_ERROR);
+
+	strbuf_release(&buf);
+	for (i = 0; i < N; i++) {
+		reftable_free(names[i]);
+	}
+	reftable_iterator_destroy(&it);
+	reftable_free(names);
+	reader_close(&rd);
+	strbuf_release(&buf);
+}
+
+static void test_table_read_write_seek(int index, int hash_id)
+{
+	char **names;
+	struct strbuf buf = STRBUF_INIT;
+	int N = 50;
+	struct reftable_reader rd = { NULL };
+	struct reftable_block_source source = { NULL };
+	int err;
+	int i = 0;
+
+	struct reftable_iterator it = { NULL };
+	struct strbuf pastLast = STRBUF_INIT;
+	struct reftable_ref_record ref = { NULL };
+
+	write_table(&names, &buf, N, 256, hash_id);
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = init_reader(&rd, &source, "file.ref");
+	EXPECT_ERR(err);
+	EXPECT(hash_id == reftable_reader_hash_id(&rd));
+
+	if (!index) {
+		rd.ref_offsets.index_offset = 0;
+	} else {
+		EXPECT(rd.ref_offsets.index_offset > 0);
+	}
+
+	for (i = 1; i < N; i++) {
+		int err = reftable_reader_seek_ref(&rd, &it, names[i]);
+		EXPECT_ERR(err);
+		err = reftable_iterator_next_ref(&it, &ref);
+		EXPECT_ERR(err);
+		EXPECT(0 == strcmp(names[i], ref.refname));
+		EXPECT(REFTABLE_REF_VAL1 == ref.value_type);
+		EXPECT(i == ref.value.val1[0]);
+
+		reftable_ref_record_release(&ref);
+		reftable_iterator_destroy(&it);
+	}
+
+	strbuf_addstr(&pastLast, names[N - 1]);
+	strbuf_addstr(&pastLast, "/");
+
+	err = reftable_reader_seek_ref(&rd, &it, pastLast.buf);
+	if (err == 0) {
+		struct reftable_ref_record ref = { NULL };
+		int err = reftable_iterator_next_ref(&it, &ref);
+		EXPECT(err > 0);
+	} else {
+		EXPECT(err > 0);
+	}
+
+	strbuf_release(&pastLast);
+	reftable_iterator_destroy(&it);
+
+	strbuf_release(&buf);
+	for (i = 0; i < N; i++) {
+		reftable_free(names[i]);
+	}
+	reftable_free(names);
+	reader_close(&rd);
+}
+
+static void test_table_read_write_seek_linear(void)
+{
+	test_table_read_write_seek(0, GIT_SHA1_FORMAT_ID);
+}
+
+static void test_table_read_write_seek_linear_sha256(void)
+{
+	test_table_read_write_seek(0, GIT_SHA256_FORMAT_ID);
+}
+
+static void test_table_read_write_seek_index(void)
+{
+	test_table_read_write_seek(1, GIT_SHA1_FORMAT_ID);
+}
+
+static void test_table_refs_for(int indexed)
+{
+	int N = 50;
+	char **want_names = reftable_calloc(sizeof(char *) * (N + 1));
+	int want_names_len = 0;
+	uint8_t want_hash[GIT_SHA1_RAWSZ];
+
+	struct reftable_write_options opts = {
+		.block_size = 256,
+	};
+	struct reftable_ref_record ref = { NULL };
+	int i = 0;
+	int n;
+	int err;
+	struct reftable_reader rd;
+	struct reftable_block_source source = { NULL };
+
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, &buf, &opts);
+
+	struct reftable_iterator it = { NULL };
+	int j;
+
+	set_test_hash(want_hash, 4);
+
+	for (i = 0; i < N; i++) {
+		uint8_t hash[GIT_SHA1_RAWSZ];
+		char fill[51] = { 0 };
+		char name[100];
+		uint8_t hash1[GIT_SHA1_RAWSZ];
+		uint8_t hash2[GIT_SHA1_RAWSZ];
+		struct reftable_ref_record ref = { NULL };
+
+		memset(hash, i, sizeof(hash));
+		memset(fill, 'x', 50);
+		/* Put the variable part in the start */
+		snprintf(name, sizeof(name), "br%02d%s", i, fill);
+		name[40] = 0;
+		ref.refname = name;
+
+		set_test_hash(hash1, i / 4);
+		set_test_hash(hash2, 3 + i / 4);
+		ref.value_type = REFTABLE_REF_VAL2;
+		ref.value.val2.value = hash1;
+		ref.value.val2.target_value = hash2;
+
+		/* 80 bytes / entry, so 3 entries per block. Yields 17
+		 */
+		/* blocks. */
+		n = reftable_writer_add_ref(w, &ref);
+		EXPECT(n == 0);
+
+		if (!memcmp(hash1, want_hash, GIT_SHA1_RAWSZ) ||
+		    !memcmp(hash2, want_hash, GIT_SHA1_RAWSZ)) {
+			want_names[want_names_len++] = xstrdup(name);
+		}
+	}
+
+	n = reftable_writer_close(w);
+	EXPECT(n == 0);
+
+	reftable_writer_free(w);
+	w = NULL;
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = init_reader(&rd, &source, "file.ref");
+	EXPECT_ERR(err);
+	if (!indexed) {
+		rd.obj_offsets.is_present = 0;
+	}
+
+	err = reftable_reader_seek_ref(&rd, &it, "");
+	EXPECT_ERR(err);
+	reftable_iterator_destroy(&it);
+
+	err = reftable_reader_refs_for(&rd, &it, want_hash);
+	EXPECT_ERR(err);
+
+	j = 0;
+	while (1) {
+		int err = reftable_iterator_next_ref(&it, &ref);
+		EXPECT(err >= 0);
+		if (err > 0) {
+			break;
+		}
+
+		EXPECT(j < want_names_len);
+		EXPECT(0 == strcmp(ref.refname, want_names[j]));
+		j++;
+		reftable_ref_record_release(&ref);
+	}
+	EXPECT(j == want_names_len);
+
+	strbuf_release(&buf);
+	free_names(want_names);
+	reftable_iterator_destroy(&it);
+	reader_close(&rd);
+}
+
+static void test_table_refs_for_no_index(void)
+{
+	test_table_refs_for(0);
+}
+
+static void test_table_refs_for_obj_index(void)
+{
+	test_table_refs_for(1);
+}
+
+static void test_write_empty_table(void)
+{
+	struct reftable_write_options opts = { 0 };
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, &buf, &opts);
+	struct reftable_block_source source = { NULL };
+	struct reftable_reader *rd = NULL;
+	struct reftable_ref_record rec = { NULL };
+	struct reftable_iterator it = { NULL };
+	int err;
+
+	reftable_writer_set_limits(w, 1, 1);
+
+	err = reftable_writer_close(w);
+	EXPECT(err == REFTABLE_EMPTY_TABLE_ERROR);
+	reftable_writer_free(w);
+
+	EXPECT(buf.len == header_size(1) + footer_size(1));
+
+	block_source_from_strbuf(&source, &buf);
+
+	err = reftable_new_reader(&rd, &source, "filename");
+	EXPECT_ERR(err);
+
+	err = reftable_reader_seek_ref(rd, &it, "");
+	EXPECT_ERR(err);
+
+	err = reftable_iterator_next_ref(&it, &rec);
+	EXPECT(err > 0);
+
+	reftable_iterator_destroy(&it);
+	reftable_reader_free(rd);
+	strbuf_release(&buf);
+}
+
+static void test_write_key_order(void)
+{
+	struct reftable_write_options opts = { 0 };
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_writer *w =
+		reftable_new_writer(&strbuf_add_void, &buf, &opts);
+	struct reftable_ref_record refs[2] = {
+		{
+			.refname = "b",
+			.update_index = 1,
+			.value_type = REFTABLE_REF_SYMREF,
+			.value = {
+				.symref = "target",
+			},
+		}, {
+			.refname = "a",
+			.update_index = 1,
+			.value_type = REFTABLE_REF_SYMREF,
+			.value = {
+				.symref = "target",
+			},
+		}
+	};
+	int err;
+
+	reftable_writer_set_limits(w, 1, 1);
+	err = reftable_writer_add_ref(w, &refs[0]);
+	EXPECT_ERR(err);
+	err = reftable_writer_add_ref(w, &refs[1]);
+	printf("%d\n", err);
+	EXPECT(err == REFTABLE_API_ERROR);
+	reftable_writer_close(w);
+	reftable_writer_free(w);
+	strbuf_release(&buf);
+}
+
+static void test_corrupt_table_empty(void)
+{
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_block_source source = { NULL };
+	struct reftable_reader rd = { NULL };
+	int err;
+
+	block_source_from_strbuf(&source, &buf);
+	err = init_reader(&rd, &source, "file.log");
+	EXPECT(err == REFTABLE_FORMAT_ERROR);
+}
+
+static void test_corrupt_table(void)
+{
+	uint8_t zeros[1024] = { 0 };
+	struct strbuf buf = STRBUF_INIT;
+	struct reftable_block_source source = { NULL };
+	struct reftable_reader rd = { NULL };
+	int err;
+	strbuf_add(&buf, zeros, sizeof(zeros));
+
+	block_source_from_strbuf(&source, &buf);
+	err = init_reader(&rd, &source, "file.log");
+	EXPECT(err == REFTABLE_FORMAT_ERROR);
+	strbuf_release(&buf);
+}
+
+int readwrite_test_main(int argc, const char *argv[])
+{
+	RUN_TEST(test_corrupt_table);
+	RUN_TEST(test_corrupt_table_empty);
+	RUN_TEST(test_log_write_read);
+	RUN_TEST(test_write_key_order);
+	RUN_TEST(test_table_read_write_seek_linear_sha256);
+	RUN_TEST(test_log_buffer_size);
+	RUN_TEST(test_table_write_small_table);
+	RUN_TEST(test_buffer);
+	RUN_TEST(test_table_read_api);
+	RUN_TEST(test_table_read_write_sequential);
+	RUN_TEST(test_table_read_write_seek_linear);
+	RUN_TEST(test_table_read_write_seek_index);
+	RUN_TEST(test_table_refs_for_no_index);
+	RUN_TEST(test_table_refs_for_obj_index);
+	RUN_TEST(test_write_empty_table);
+	return 0;
+}
diff --git a/reftable/reftable-tests.h b/reftable/reftable-tests.h
index 5e7698ae654..3d541fa5c0c 100644
--- a/reftable/reftable-tests.h
+++ b/reftable/reftable-tests.h
@@ -14,7 +14,7 @@ int block_test_main(int argc, const char **argv);
 int merged_test_main(int argc, const char **argv);
 int record_test_main(int argc, const char **argv);
 int refname_test_main(int argc, const char **argv);
-int reftable_test_main(int argc, const char **argv);
+int readwrite_test_main(int argc, const char **argv);
 int stack_test_main(int argc, const char **argv);
 int tree_test_main(int argc, const char **argv);
 int reftable_dump_main(int argc, char *const *argv);
diff --git a/t/helper/test-reftable.c b/t/helper/test-reftable.c
index 050551fa698..898aba836fd 100644
--- a/t/helper/test-reftable.c
+++ b/t/helper/test-reftable.c
@@ -6,6 +6,7 @@ int cmd__reftable(int argc, const char **argv)
 	basics_test_main(argc, argv);
 	block_test_main(argc, argv);
 	record_test_main(argc, argv);
+	readwrite_test_main(argc, argv);
 	tree_test_main(argc, argv);
 	return 0;
 }
-- 
gitgitgadget
Previous: Han-Wen Nienhuys via GitGitGadgetNext: Han-Wen Nienhuys via GitGitGadget
Message 44 of 132 in “Support reftable ref backend for Git”
  1. 00/26 Support reftable ref backend for GitHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  2. 01/26 hash.h: provide constants for the hash IDsHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  3. 02/26 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  4. 03/26 reftable: RFC: add LICENSEHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  5. 06/26 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  6. 04/26 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  7. 05/26 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  8. 08/26 Provide zlib's uncompress2 from compat/zlib-compat.cHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  9. 07/26 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  10. 10/26 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  11. 13/26 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  12. 15/26 reftable: add a heap-based priority queue for reftable recordsHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  13. 09/26 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  14. 12/26 reftable: generic interface to tablesHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  15. 14/26 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  16. 11/26 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  17. 19/26 reftable: add dump utilityHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  18. 17/26 reftable: implement refname validationHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  19. 16/26 reftable: add merged table viewHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  20. 20/26 refs: RFC: Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  21. 24/26 t1401,t2011: parameterize HEAD.lock for REFFILESHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  22. 23/26 t1301: document what needs to be done for reftableHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  23. 26/26 t7004: avoid direct filesystem accessHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  24. 25/26 t1404: annotate test cases with REFFILESHan-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  25. 21/26 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Jul 20, 2021
  26. 18/26 reftable: implement stack, a mutable database of reftable files.Han-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  27. 22/26 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Jul 20, 2021
  28. 00/25 Support reftable ref backend for GitHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  29. 01/25 hash.h: provide constants for the hash IDsHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  30. 02/25 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  31. 03/25 reftable: RFC: add LICENSEHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  32. 04/25 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  33. 05/25 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  34. 06/25 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  35. 08/25 Provide zlib's uncompress2 from compat/zlib-compat.cHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  36. 07/25 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  37. Carlo Marcelo Arenas BelónAug 16, 2021
  38. Han-Wen NienhuysAug 17, 2021
  39. 09/25 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  40. 10/25 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  41. 11/25 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  42. 12/25 reftable: generic interface to tablesHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  43. 13/25 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  44. 14/25 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  45. 15/25 reftable: add a heap-based priority queue for reftable recordsHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  46. 16/25 reftable: add merged table viewHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  47. 17/25 reftable: implement refname validationHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  48. 18/25 reftable: implement stack, a mutable database of reftable files.Han-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  49. 19/25 reftable: add dump utilityHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  50. 21/25 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Aug 16, 2021
  51. 20/25 refs: RFC: Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  52. 22/25 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  53. 23/25 t1301: document what needs to be done for reftableHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  54. 24/25 t1401,t2011: parameterize HEAD.lock for REFFILESHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  55. 25/25 t1404: annotate test cases with REFFILESHan-Wen Nienhuys via GitGitGadget, Aug 16, 2021
  56. Junio C HamanoAug 16, 2021
  57. Han-Wen NienhuysAug 17, 2021
  58. 00/25 Support reftable ref backend for GitHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  59. 01/25 hash.h: provide constants for the hash IDsHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  60. Ævar Arnfjörð BjarmasonAug 23, 2021
  61. 06/25 reftable: add blocksource, an abstraction for random access readsHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  62. 08/25 Provide zlib's uncompress2 from compat/zlib-compat.cHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  63. Philip OakleyAug 18, 2021
  64. Han-Wen NienhuysAug 18, 2021
  65. Philip OakleyAug 18, 2021
  66. 09/25 reftable: reading/writing blocksHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  67. 05/25 reftable: utility functionsHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  68. 03/25 reftable: RFC: add LICENSEHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  69. 04/25 reftable: add error related functionalityHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  70. 12/25 reftable: generic interface to tablesHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  71. 07/25 reftable: (de)serialization for the polymorphic record type.Han-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  72. 11/25 reftable: write reftable filesHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  73. 10/25 reftable: a generic binary tree implementationHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  74. 21/25 git-prompt: prepare for reftable refs backendSZEDER Gábor via GitGitGadget, Aug 17, 2021
  75. 20/25 refs: RFC: Reftable support for git-coreHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  76. Ævar Arnfjörð BjarmasonAug 23, 2021
  77. Han-Wen NienhuysAug 30, 2021
  78. Ævar Arnfjörð BjarmasonAug 30, 2021
  79. 19/25 reftable: add dump utilityHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  80. 15/25 reftable: add a heap-based priority queue for reftable recordsHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  81. 13/25 reftable: read reftable filesHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  82. 25/25 t1404: annotate test cases with REFFILESHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  83. 16/25 reftable: add merged table viewHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  84. 18/25 reftable: implement stack, a mutable database of reftable files.Han-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  85. 24/25 t1401,t2011: parameterize HEAD.lock for REFFILESHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  86. 22/25 Add "test-tool dump-reftable" command.Han-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  87. 17/25 reftable: implement refname validationHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  88. 23/25 t1301: document what needs to be done for reftableHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  89. 14/25 reftable: reftable file level testsHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  90. 02/25 init-db: set the_repository->hash_algo early onHan-Wen Nienhuys via GitGitGadget, Aug 17, 2021
  91. Ævar Arnfjörð BjarmasonAug 23, 2021
  92. Ævar Arnfjörð BjarmasonAug 26, 2021
  93. 00/28 Support reftable ref backend for GitÆvar Arnfjörð Bjarmason, Aug 23, 2021
  94. 01/28 hash.h: provide constants for the hash IDsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  95. 02/28 init-db: set the_repository->hash_algo early onÆvar Arnfjörð Bjarmason, Aug 23, 2021
  96. 03/28 reftable: RFC: add LICENSEÆvar Arnfjörð Bjarmason, Aug 23, 2021
  97. 04/28 reftable: add error related functionalityÆvar Arnfjörð Bjarmason, Aug 23, 2021
  98. 05/28 reftable: utility functionsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  99. 06/28 reftable: add blocksource, an abstraction for random access readsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  100. 07/28 reftable: (de)serialization for the polymorphic record type.Ævar Arnfjörð Bjarmason, Aug 23, 2021
  101. 08/28 Provide zlib's uncompress2 from compat/zlib-compat.cÆvar Arnfjörð Bjarmason, Aug 23, 2021
  102. 09/28 reftable: reading/writing blocksÆvar Arnfjörð Bjarmason, Aug 23, 2021
  103. 10/28 reftable: a generic binary tree implementationÆvar Arnfjörð Bjarmason, Aug 23, 2021
  104. 12/28 reftable: generic interface to tablesÆvar Arnfjörð Bjarmason, Aug 23, 2021
  105. 13/28 reftable: read reftable filesÆvar Arnfjörð Bjarmason, Aug 23, 2021
  106. 14/28 reftable: reftable file level testsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  107. 15/28 reftable: add a heap-based priority queue for reftable recordsÆvar Arnfjörð Bjarmason, Aug 23, 2021
  108. 16/28 reftable: add merged table viewÆvar Arnfjörð Bjarmason, Aug 23, 2021
  109. 17/28 reftable: implement refname validationÆvar Arnfjörð Bjarmason, Aug 23, 2021
  110. 19/28 reftable: add dump utilityÆvar Arnfjörð Bjarmason, Aug 23, 2021
  111. 18/28 reftable: implement stack, a mutable database of reftable files.Ævar Arnfjörð Bjarmason, Aug 23, 2021
  112. Junio C HamanoAug 27, 2021
  113. reftable: fixup for broken __FUNCTION__ useÆvar Arnfjörð Bjarmason, Aug 27, 2021
  114. Carlo ArenasAug 27, 2021
  115. Han-Wen NienhuysAug 30, 2021
  116. 21/28 git-prompt: prepare for reftable refs backendÆvar Arnfjörð Bjarmason, Aug 23, 2021
  117. 20/28 refs: RFC: Reftable support for git-coreÆvar Arnfjörð Bjarmason, Aug 23, 2021
  118. 22/28 Add "test-tool dump-reftable" command.Ævar Arnfjörð Bjarmason, Aug 23, 2021
  119. 23/28 t1301: document what needs to be done for reftableÆvar Arnfjörð Bjarmason, Aug 23, 2021
  120. 26/28 reftable: fixup for new base topic 1/3Ævar Arnfjörð Bjarmason, Aug 23, 2021
  121. 25/28 t1404: annotate test cases with REFFILESÆvar Arnfjörð Bjarmason, Aug 23, 2021
  122. 24/28 t1401,t2011: parameterize HEAD.lock for REFFILESÆvar Arnfjörð Bjarmason, Aug 23, 2021
  123. 27/28 reftable: fixup for new base topic 2/3Ævar Arnfjörð Bjarmason, Aug 23, 2021
  124. Han-Wen NienhuysAug 30, 2021
  125. Ævar Arnfjörð BjarmasonAug 30, 2021
  126. Han-Wen NienhuysAug 30, 2021
  127. Ævar Arnfjörð BjarmasonAug 30, 2021
  128. 28/28 reftable: fixup for new base topic 3/3Ævar Arnfjörð Bjarmason, Aug 23, 2021
  129. 11/28 reftable: write reftable filesÆvar Arnfjörð Bjarmason, Aug 23, 2021
  130. Junio C HamanoAug 26, 2021
  131. Han-Wen NienhuysAug 26, 2021
  132. Junio C HamanoAug 26, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.