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

[PATCH 06/19] reftable/record: don't `BUG()` in `reftable_record_cmp()`

From
Patrick Steinhardt <ps@pks.im>
Date
Jan 27, 2025, 13:04 UTC
Message-ID
<20250127-pks-reftable-drop-git-compat-util-v1-6-6e280a564877@pks.im>
In-Reply-To
<20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im>

The refatble library aborts with a bug in case `reftable_record_cmp()` is invoked with two records of differing types. This would cause the program to die without the caller being able to handle the error, which is not something we want in the context of library code. And it ties us to the Git codebase.

Refactor the code such that `reftable_record_cmp()` returns an error code separate from the actual comparison result. This requires us to also adapt some callers up the callchain in a similar fashion.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 reftable/merged.c                | 20 +++++++++++++++-----
 reftable/pq.c                    | 36 +++++++++++++++++++++++++++++-------
 reftable/pq.h                    |  2 +-
 reftable/record.c                | 10 ++++++----
 reftable/record.h                |  2 +-
 t/unit-tests/t-reftable-pq.c     | 16 ++++++++++++----
 t/unit-tests/t-reftable-record.c | 40 ++++++++++++++++++++++++++++------------
 7 files changed, 92 insertions(+), 34 deletions(-)
diff --git a/reftable/merged.c b/reftable/merged.c
index 4156eec07f..563864068c 100644
--- a/reftable/merged.c
+++ b/reftable/merged.c
@@ -66,8 +66,11 @@ static int merged_iter_seek(struct merged_iter *mi, struct reftable_record *want
 	int err;
 
 	mi->advance_index = -1;
-	while (!merged_iter_pqueue_is_empty(mi->pq))
-		merged_iter_pqueue_remove(&mi->pq);
+	while (!merged_iter_pqueue_is_empty(mi->pq)) {
+		err = merged_iter_pqueue_remove(&mi->pq, NULL);
+		if (err < 0)
+			return err;
+	}
 
 	for (size_t i = 0; i < mi->subiters_len; i++) {
 		err = iterator_seek(&mi->subiters[i].iter, want);
@@ -120,7 +123,9 @@ static int merged_iter_next_entry(struct merged_iter *mi,
 	if (empty)
 		return 1;
 
-	entry = merged_iter_pqueue_remove(&mi->pq);
+	err = merged_iter_pqueue_remove(&mi->pq, &entry);
+	if (err < 0)
+		return err;
 
 	/*
 	  One can also use reftable as datacenter-local storage, where the ref
@@ -134,11 +139,16 @@ static int merged_iter_next_entry(struct merged_iter *mi,
 		struct pq_entry top = merged_iter_pqueue_top(mi->pq);
 		int cmp;
 
-		cmp = reftable_record_cmp(top.rec, entry.rec);
+		err = reftable_record_cmp(top.rec, entry.rec, &cmp);
+		if (err < 0)
+			return err;
 		if (cmp > 0)
 			break;
 
-		merged_iter_pqueue_remove(&mi->pq);
+		err = merged_iter_pqueue_remove(&mi->pq, NULL);
+		if (err < 0)
+			return err;
+
 		err = merged_iter_advance_subiter(mi, top.index);
 		if (err < 0)
 			return err;
diff --git a/reftable/pq.c b/reftable/pq.c
index 5591e875e1..ef8035cfd9 100644
--- a/reftable/pq.c
+++ b/reftable/pq.c
@@ -15,13 +15,18 @@ license that can be found in the LICENSE file or at
 
 int pq_less(struct pq_entry *a, struct pq_entry *b)
 {
-	int cmp = reftable_record_cmp(a->rec, b->rec);
+	int cmp, err;
+
+	err = reftable_record_cmp(a->rec, b->rec, &cmp);
+	if (err < 0)
+		return err;
+
 	if (cmp == 0)
 		return a->index > b->index;
 	return cmp < 0;
 }
 
-struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq)
+int merged_iter_pqueue_remove(struct merged_iter_pqueue *pq, struct pq_entry *out)
 {
 	size_t i = 0;
 	struct pq_entry e = pq->heap[0];
@@ -32,17 +37,34 @@ struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq)
 		size_t min = i;
 		size_t j = 2 * i + 1;
 		size_t k = 2 * i + 2;
-		if (j < pq->len && pq_less(&pq->heap[j], &pq->heap[i]))
-			min = j;
-		if (k < pq->len && pq_less(&pq->heap[k], &pq->heap[min]))
-			min = k;
+		int cmp;
+
+		if (j < pq->len) {
+			cmp = pq_less(&pq->heap[j], &pq->heap[i]);
+			if (cmp < 0)
+				return -1;
+			else if (cmp)
+				min = j;
+		}
+
+		if (k < pq->len) {
+			cmp = pq_less(&pq->heap[k], &pq->heap[min]);
+			if (cmp < 0)
+				return -1;
+			else if (cmp)
+				min = k;
+		}
+
 		if (min == i)
 			break;
 		SWAP(pq->heap[i], pq->heap[min]);
 		i = min;
 	}
 
-	return e;
+	if (out)
+		*out = e;
+
+	return 0;
 }
 
 int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e)
diff --git a/reftable/pq.h b/reftable/pq.h
index 83c062eeca..ff39016445 100644
--- a/reftable/pq.h
+++ b/reftable/pq.h
@@ -22,7 +22,7 @@ struct merged_iter_pqueue {
 	size_t cap;
 };
 
-struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq);
+int merged_iter_pqueue_remove(struct merged_iter_pqueue *pq, struct pq_entry *out);
 int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e);
 void merged_iter_pqueue_release(struct merged_iter_pqueue *pq);
 int pq_less(struct pq_entry *a, struct pq_entry *b);
diff --git a/reftable/record.c b/reftable/record.c
index 31985bb977..da550494a2 100644
--- a/reftable/record.c
+++ b/reftable/record.c
@@ -1190,12 +1190,14 @@ int reftable_record_is_deletion(struct reftable_record *rec)
 		reftable_record_data(rec));
 }
 
-int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b)
+int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b,
+			int *cmp)
 {
 	if (a->type != b->type)
-		BUG("cannot compare reftable records of different type");
-	return reftable_record_vtable(a)->cmp(
-		reftable_record_data(a), reftable_record_data(b));
+		return -1;
+	*cmp = reftable_record_vtable(a)->cmp(reftable_record_data(a),
+					      reftable_record_data(b));
+	return 0;
 }
 
 int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size)
diff --git a/reftable/record.h b/reftable/record.h
index e1846c294b..867810a932 100644
--- a/reftable/record.h
+++ b/reftable/record.h
@@ -134,7 +134,7 @@ struct reftable_record {
 int reftable_record_init(struct reftable_record *rec, uint8_t typ);
 
 /* see struct record_vtable */
-int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b);
+int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b, int *cmp);
 int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size);
 int reftable_record_key(struct reftable_record *rec, struct reftable_buf *dest);
 int reftable_record_copy_from(struct reftable_record *rec,
diff --git a/t/unit-tests/t-reftable-pq.c b/t/unit-tests/t-reftable-pq.c
index d8a4c283a1..c128fe8616 100644
--- a/t/unit-tests/t-reftable-pq.c
+++ b/t/unit-tests/t-reftable-pq.c
@@ -21,7 +21,9 @@ static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq)
 
 static int pq_entry_equal(struct pq_entry *a, struct pq_entry *b)
 {
-	return !reftable_record_cmp(a->rec, b->rec) && (a->index == b->index);
+	int cmp;
+	check(!reftable_record_cmp(a->rec, b->rec, &cmp));
+	return !cmp && (a->index == b->index);
 }
 
 static void t_pq_record(void)
@@ -49,7 +51,9 @@ static void t_pq_record(void)
 
 	while (!merged_iter_pqueue_is_empty(pq)) {
 		struct pq_entry top = merged_iter_pqueue_top(pq);
-		struct pq_entry e = merged_iter_pqueue_remove(&pq);
+		struct pq_entry e;
+
+		check(!merged_iter_pqueue_remove(&pq, &e));
 		merged_iter_pqueue_check(&pq);
 
 		check(pq_entry_equal(&top, &e));
@@ -90,7 +94,9 @@ static void t_pq_index(void)
 
 	for (i = N - 1; i > 0; i--) {
 		struct pq_entry top = merged_iter_pqueue_top(pq);
-		struct pq_entry e = merged_iter_pqueue_remove(&pq);
+		struct pq_entry e;
+
+		check(!merged_iter_pqueue_remove(&pq, &e));
 		merged_iter_pqueue_check(&pq);
 
 		check(pq_entry_equal(&top, &e));
@@ -129,7 +135,9 @@ static void t_merged_iter_pqueue_top(void)
 
 	for (i = N - 1; i > 0; i--) {
 		struct pq_entry top = merged_iter_pqueue_top(pq);
-		struct pq_entry e = merged_iter_pqueue_remove(&pq);
+		struct pq_entry e;
+
+		check(!merged_iter_pqueue_remove(&pq, &e));
 
 		merged_iter_pqueue_check(&pq);
 		check(pq_entry_equal(&top, &e));
diff --git a/t/unit-tests/t-reftable-record.c b/t/unit-tests/t-reftable-record.c
index 6540bd20e3..5954966373 100644
--- a/t/unit-tests/t-reftable-record.c
+++ b/t/unit-tests/t-reftable-record.c
@@ -100,16 +100,20 @@ static void t_reftable_ref_record_comparison(void)
 			.u.ref.value.symref = (char *) "refs/heads/master",
 		},
 	};
+	int cmp;
 
 	check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 
 	check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
-	check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
+	check(!reftable_record_cmp(&in[1], &in[2], &cmp));
+	check_int(cmp, >, 0);
 
 	in[1].u.ref.value_type = in[0].u.ref.value_type;
 	check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 }
 
 static void t_reftable_ref_record_compare_name(void)
@@ -209,17 +213,20 @@ static void t_reftable_log_record_comparison(void)
 			.u.log.update_index = 22,
 		},
 	};
+	int cmp;
 
 	check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
 	check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
-	check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
+	check(!reftable_record_cmp(&in[1], &in[2], &cmp));
+	check_int(cmp, >, 0);
 	/* comparison should be reversed for equal keys, because
 	 * comparison is now performed on the basis of update indices */
-	check_int(reftable_record_cmp(&in[0], &in[1]), <, 0);
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check_int(cmp, <, 0);
 
 	in[1].u.log.update_index = in[0].u.log.update_index;
 	check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
 }
 
 static void t_reftable_log_record_compare_key(void)
@@ -396,16 +403,20 @@ static void t_reftable_obj_record_comparison(void)
 			.u.obj.hash_prefix_len = 5,
 		},
 	};
+	int cmp;
 
 	check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 
 	check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
-	check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
+	check(!reftable_record_cmp(&in[1], &in[2], &cmp));
+	check_int(cmp, >, 0);
 
 	in[1].u.obj.offset_len = in[0].u.obj.offset_len;
 	check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 }
 
 static void t_reftable_obj_record_roundtrip(void)
@@ -486,19 +497,24 @@ static void t_reftable_index_record_comparison(void)
 			.u.idx.last_key = REFTABLE_BUF_INIT,
 		},
 	};
+	int cmp;
+
 	check(!reftable_buf_addstr(&in[0].u.idx.last_key, "refs/heads/master"));
 	check(!reftable_buf_addstr(&in[1].u.idx.last_key, "refs/heads/master"));
 	check(!reftable_buf_addstr(&in[2].u.idx.last_key, "refs/heads/branch"));
 
 	check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 
 	check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1));
-	check_int(reftable_record_cmp(&in[1], &in[2]), >, 0);
+	check(!reftable_record_cmp(&in[1], &in[2], &cmp));
+	check_int(cmp, >, 0);
 
 	in[1].u.idx.offset = in[0].u.idx.offset;
 	check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1));
-	check(!reftable_record_cmp(&in[0], &in[1]));
+	check(!reftable_record_cmp(&in[0], &in[1], &cmp));
+	check(!cmp);
 
 	for (size_t i = 0; i < ARRAY_SIZE(in); i++)
 		reftable_record_release(&in[i]);
-- 
2.48.1.362.g079036d154.dirty
Previous: Justin ToblerNext: Justin Tobler
Message 12 of 123 in “reftable: stop using "git-compat-util.h"”
  1. 00/19 reftable: stop using "git-compat-util.h"Patrick Steinhardt, Jan 27, 2025
  2. 02/19 reftable/stack: stop using `write_in_full()`Patrick Steinhardt, Jan 27, 2025
  3. 01/19 reftable/stack: stop using `read_in_full()`Patrick Steinhardt, Jan 27, 2025
  4. Justin ToblerJan 27, 2025
  5. Patrick SteinhardtJan 28, 2025
  6. Junio C HamanoJan 28, 2025
  7. Patrick SteinhardtJan 29, 2025
  8. 03/19 reftable/blocksource: stop using `xmmap()`Patrick Steinhardt, Jan 27, 2025
  9. 04/19 reftable/record: stop using `COPY_ARRAY()`Patrick Steinhardt, Jan 27, 2025
  10. 05/19 reftable/record: stop using `BUG()` in `reftable_record_init()`Patrick Steinhardt, Jan 27, 2025
  11. Justin ToblerJan 27, 2025
  12. 06/19 reftable/record: don't `BUG()` in `reftable_record_cmp()`Patrick Steinhardt, Jan 27, 2025
  13. Justin ToblerJan 27, 2025
  14. 07/19 reftable: stop using `BUG()` in trivial casesPatrick Steinhardt, Jan 27, 2025
  15. 08/19 reftable/basics: stop using `st_mult()` in array allocatorsPatrick Steinhardt, Jan 27, 2025
  16. 09/19 reftable/basics: provide wrappers for big endian conversionPatrick Steinhardt, Jan 27, 2025
  17. 10/19 reftable/reader: stop using `ARRAY_SIZE()` macroPatrick Steinhardt, Jan 27, 2025
  18. 11/19 reftable/system: introduce `reftable_rand()`Patrick Steinhardt, Jan 27, 2025
  19. 12/19 reftable/stack: stop using `sleep_millisec()`Patrick Steinhardt, Jan 27, 2025
  20. 13/19 reftable/basics: stop using `SWAP()` macroPatrick Steinhardt, Jan 27, 2025
  21. 14/19 reftable/basics: stop using `UNUSED` annotationPatrick Steinhardt, Jan 27, 2025
  22. 15/19 compat/mingw: split out POSIX-related bitsPatrick Steinhardt, Jan 27, 2025
  23. 16/19 compat/msvc: split out POSIX-related bitsPatrick Steinhardt, Jan 27, 2025
  24. 17/19 git-compat-util.h: split out POSIX-emulating bitsPatrick Steinhardt, Jan 27, 2025
  25. Justin ToblerJan 27, 2025
  26. 18/19 reftable: decouple from Git codebase by pulling in "compat/posix.h"Patrick Steinhardt, Jan 27, 2025
  27. 19/19 Makefile: skip reftable library for CoccinellePatrick Steinhardt, Jan 27, 2025
  28. Junio C HamanoJan 27, 2025
  29. Patrick SteinhardtJan 28, 2025
  30. Junio C HamanoJan 28, 2025
  31. 00/20 reftable: stop using "git-compat-util.h"Patrick Steinhardt, Jan 28, 2025
  32. 01/20 reftable/stack: stop using `read_in_full()`Patrick Steinhardt, Jan 28, 2025
  33. 02/20 reftable/stack: stop using `write_in_full()`Patrick Steinhardt, Jan 28, 2025
  34. 04/20 reftable/record: stop using `COPY_ARRAY()`Patrick Steinhardt, Jan 28, 2025
  35. Justin ToblerJan 29, 2025
  36. Patrick SteinhardtFeb 3, 2025
  37. 03/20 reftable/blocksource: stop using `xmmap()`Patrick Steinhardt, Jan 28, 2025
  38. 05/20 reftable/record: stop using `BUG()` in `reftable_record_init()`Patrick Steinhardt, Jan 28, 2025
  39. 06/20 reftable/record: don't `BUG()` in `reftable_record_cmp()`Patrick Steinhardt, Jan 28, 2025
  40. 07/20 reftable: stop using `BUG()` in trivial casesPatrick Steinhardt, Jan 28, 2025
  41. 08/20 reftable/basics: stop using `st_mult()` in array allocatorsPatrick Steinhardt, Jan 28, 2025
  42. 09/20 reftable/basics: provide wrappers for big endian conversionPatrick Steinhardt, Jan 28, 2025
  43. 10/20 reftable/reader: stop using `ARRAY_SIZE()` macroPatrick Steinhardt, Jan 28, 2025
  44. 11/20 reftable/system: introduce `reftable_rand()`Patrick Steinhardt, Jan 28, 2025
  45. 12/20 reftable/stack: stop using `sleep_millisec()`Patrick Steinhardt, Jan 28, 2025
  46. 13/20 reftable/basics: stop using `SWAP()` macroPatrick Steinhardt, Jan 28, 2025
  47. 14/20 reftable/basics: stop using `UNUSED` annotationPatrick Steinhardt, Jan 28, 2025
  48. 15/20 compat: consistently resolve headers via project rootPatrick Steinhardt, Jan 28, 2025
  49. Johannes SixtJan 29, 2025
  50. Junio C HamanoJan 29, 2025
  51. Patrick SteinhardtFeb 3, 2025
  52. 16/20 compat/mingw: split out POSIX-related bitsPatrick Steinhardt, Jan 28, 2025
  53. 17/20 compat/msvc: split out POSIX-related bitsPatrick Steinhardt, Jan 28, 2025
  54. 18/20 git-compat-util.h: split out POSIX-emulating bitsPatrick Steinhardt, Jan 28, 2025
  55. 19/20 reftable: decouple from Git codebase by pulling in "compat/posix.h"Patrick Steinhardt, Jan 28, 2025
  56. 20/20 Makefile: skip reftable library for CoccinellePatrick Steinhardt, Jan 28, 2025
  57. Junio C HamanoJan 28, 2025
  58. Patrick SteinhardtJan 29, 2025
  59. Junio C HamanoJan 29, 2025
  60. 00/18 reftable: stop using "git-compat-util.h"Patrick Steinhardt, Feb 3, 2025
  61. 01/18 reftable/stack: stop using `read_in_full()`Patrick Steinhardt, Feb 3, 2025
  62. 02/18 reftable/stack: stop using `write_in_full()`Patrick Steinhardt, Feb 3, 2025
  63. 03/18 reftable/blocksource: stop using `xmmap()`Patrick Steinhardt, Feb 3, 2025
  64. 04/18 reftable/record: stop using `COPY_ARRAY()`Patrick Steinhardt, Feb 3, 2025
  65. 05/18 reftable/record: stop using `BUG()` in `reftable_record_init()`Patrick Steinhardt, Feb 3, 2025
  66. 06/18 reftable/record: don't `BUG()` in `reftable_record_cmp()`Patrick Steinhardt, Feb 3, 2025
  67. 07/18 reftable: stop using `BUG()` in trivial casesPatrick Steinhardt, Feb 3, 2025
  68. 08/18 reftable/basics: stop using `st_mult()` in array allocatorsPatrick Steinhardt, Feb 3, 2025
  69. 09/18 reftable/basics: provide wrappers for big endian conversionPatrick Steinhardt, Feb 3, 2025
  70. 10/18 reftable/reader: stop using `ARRAY_SIZE()` macroPatrick Steinhardt, Feb 3, 2025
  71. 11/18 reftable/system: introduce `reftable_rand()`Patrick Steinhardt, Feb 3, 2025
  72. 12/18 reftable/stack: stop using `sleep_millisec()`Patrick Steinhardt, Feb 3, 2025
  73. 13/18 reftable/basics: stop using `SWAP()` macroPatrick Steinhardt, Feb 3, 2025
  74. 14/18 reftable/basics: stop using `UNUSED` annotationPatrick Steinhardt, Feb 3, 2025
  75. 15/18 compat/mingw: split out POSIX-related bitsPatrick Steinhardt, Feb 3, 2025
  76. 16/18 git-compat-util.h: split out POSIX-emulating bitsPatrick Steinhardt, Feb 3, 2025
  77. 17/18 reftable: decouple from Git codebase by pulling in "compat/posix.h"Patrick Steinhardt, Feb 3, 2025
  78. 18/18 Makefile: skip reftable library for CoccinellePatrick Steinhardt, Feb 3, 2025
  79. Justin ToblerFeb 6, 2025
  80. 00/18 reftable: stop using "git-compat-util.h"Patrick Steinhardt, Feb 6, 2025
  81. 02/18 reftable/stack: stop using `write_in_full()`Patrick Steinhardt, Feb 6, 2025
  82. 01/18 reftable/stack: stop using `read_in_full()`Patrick Steinhardt, Feb 6, 2025
  83. 03/18 reftable/blocksource: stop using `xmmap()`Patrick Steinhardt, Feb 6, 2025
  84. 04/18 reftable/record: stop using `COPY_ARRAY()`Patrick Steinhardt, Feb 6, 2025
  85. 05/18 reftable/record: stop using `BUG()` in `reftable_record_init()`Patrick Steinhardt, Feb 6, 2025
  86. 06/18 reftable/record: don't `BUG()` in `reftable_record_cmp()`Patrick Steinhardt, Feb 6, 2025
  87. 07/18 reftable: stop using `BUG()` in trivial casesPatrick Steinhardt, Feb 6, 2025
  88. 08/18 reftable/basics: stop using `st_mult()` in array allocatorsPatrick Steinhardt, Feb 6, 2025
  89. 10/18 reftable/reader: stop using `ARRAY_SIZE()` macroPatrick Steinhardt, Feb 6, 2025
  90. 09/18 reftable/basics: provide wrappers for big endian conversionPatrick Steinhardt, Feb 6, 2025
  91. 11/18 reftable/system: introduce `reftable_rand()`Patrick Steinhardt, Feb 6, 2025
  92. 12/18 reftable/stack: stop using `sleep_millisec()`Patrick Steinhardt, Feb 6, 2025
  93. 13/18 reftable/basics: stop using `SWAP()` macroPatrick Steinhardt, Feb 6, 2025
  94. 14/18 reftable/basics: stop using `UNUSED` annotationPatrick Steinhardt, Feb 6, 2025
  95. Toon ClaesFeb 7, 2025
  96. Patrick SteinhardtFeb 7, 2025
  97. 15/18 compat/mingw: split out POSIX-related bitsPatrick Steinhardt, Feb 6, 2025
  98. 16/18 git-compat-util.h: split out POSIX-emulating bitsPatrick Steinhardt, Feb 6, 2025
  99. 17/18 reftable: decouple from Git codebase by pulling in "compat/posix.h"Patrick Steinhardt, Feb 6, 2025
  100. 18/18 Makefile: skip reftable library for CoccinellePatrick Steinhardt, Feb 6, 2025
  101. 00/18 reftable: stop using "git-compat-util.h"Patrick Steinhardt, Feb 7, 2025
  102. 01/18 reftable/stack: stop using `read_in_full()`Patrick Steinhardt, Feb 7, 2025
  103. 02/18 reftable/stack: stop using `write_in_full()`Patrick Steinhardt, Feb 7, 2025
  104. 03/18 reftable/blocksource: stop using `xmmap()`Patrick Steinhardt, Feb 7, 2025
  105. 04/18 reftable/record: stop using `COPY_ARRAY()`Patrick Steinhardt, Feb 7, 2025
  106. 05/18 reftable/record: stop using `BUG()` in `reftable_record_init()`Patrick Steinhardt, Feb 7, 2025
  107. 06/18 reftable/record: don't `BUG()` in `reftable_record_cmp()`Patrick Steinhardt, Feb 7, 2025
  108. 08/18 reftable/basics: stop using `st_mult()` in array allocatorsPatrick Steinhardt, Feb 7, 2025
  109. 07/18 reftable: stop using `BUG()` in trivial casesPatrick Steinhardt, Feb 7, 2025
  110. 09/18 reftable/basics: provide wrappers for big endian conversionPatrick Steinhardt, Feb 7, 2025
  111. 10/18 reftable/reader: stop using `ARRAY_SIZE()` macroPatrick Steinhardt, Feb 7, 2025
  112. 11/18 reftable/system: introduce `reftable_rand()`Patrick Steinhardt, Feb 7, 2025
  113. 12/18 reftable/stack: stop using `sleep_millisec()`Patrick Steinhardt, Feb 7, 2025
  114. 13/18 reftable/basics: stop using `SWAP()` macroPatrick Steinhardt, Feb 7, 2025
  115. 14/18 reftable/basics: introduce `REFTABLE_UNUSED` annotationPatrick Steinhardt, Feb 7, 2025
  116. 15/18 compat/mingw: split out POSIX-related bitsPatrick Steinhardt, Feb 7, 2025
  117. Johannes SixtFeb 9, 2025
  118. Junio C HamanoFeb 10, 2025
  119. Johannes SchindelinFeb 13, 2025
  120. Patrick SteinhardtFeb 17, 2025
  121. 16/18 git-compat-util.h: split out POSIX-emulating bitsPatrick Steinhardt, Feb 7, 2025
  122. 17/18 reftable: decouple from Git codebase by pulling in "compat/posix.h"Patrick Steinhardt, Feb 7, 2025
  123. 18/18 Makefile: skip reftable library for CoccinellePatrick Steinhardt, Feb 7, 2025

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.