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

Re: [PATCH v6 14/15] reftable: make reftable_record a tagged union

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Jan 21, 2022, 12:06 UTC
Message-ID
<220121.86fsphjml0.gmgdl@evledraar.gmail.com>
In-Reply-To
<54bcac325bd542aa81328e5616b2b7573d43adac.1642691534.git.gitgitgadget@gmail.com>
On Thu, Jan 20 2022, Han-Wen Nienhuys via GitGitGadget wrote:
Show 13 quoted lines
> From: Han-Wen Nienhuys <hanwen@google.com>
>
> This reduces the amount of glue code, because we don't need a void
> pointer or vtable within the structure.
> [...]
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_ref(&rec, &ref);
> +	struct reftable_record rec = { .type = BLOCK_TYPE_REF,
> +				       .u.ref = {
> +					       .refname = (char *)name,
> +				       } };
>  	return tab->ops->seek_record(tab->table_arg, it, &rec);
>  }
Both for this & the below don't we prefer to have such assignments on
their own line? I.e.:
	
	struct reftable_record rec = {
		.type = BLOCK_TYPE_REF,
	        .u.ref = { .refname = (char *)name },
	};
In this case the snuggling is buying is nothing in terms of line count,
and for the .u.ref assignment we were split across 3 lines instead of
1. So this seems easier to read to me....
	
Show 14 quoted lines
>  int reftable_table_seek_log(struct reftable_table *tab,
>  			    struct reftable_iterator *it, const char *name)
>  {
> -	struct reftable_log_record log = {
> -		.refname = (char *)name,
> -		.update_index = ~((uint64_t)0),
> -	};
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_log(&rec, &log);
> +	struct reftable_record rec = { .type = BLOCK_TYPE_LOG,
> +				       .u.log = {
> +					       .refname = (char *)name,
> +					       .update_index = ~((uint64_t)0),
> +				       } };
...ditto..
Show 14 quoted lines
>  	return tab->ops->seek_record(tab->table_arg, it, &rec);
>  }
>  
> @@ -129,17 +128,25 @@ void reftable_iterator_destroy(struct reftable_iterator *it)
>  int reftable_iterator_next_ref(struct reftable_iterator *it,
>  			       struct reftable_ref_record *ref)
>  {
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_ref(&rec, ref);
> -	return iterator_next(it, &rec);
> +	struct reftable_record rec = {
> +		.type = BLOCK_TYPE_REF,
> +		.u.ref = *ref,
> +	};
...and here we have the sort of assignment I'm suggesting, not
	struct reftable_record rec = { .type = [...]
...
Show 10 quoted lines
>  int reftable_iterator_next_log(struct reftable_iterator *it,
>  			       struct reftable_log_record *log)
>  {
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_log(&rec, log);
> -	return iterator_next(it, &rec);
> +	struct reftable_record rec = {
> +		.type = BLOCK_TYPE_LOG,
> +		.u.log = *log,
> +	};
...ditto (good)....
Show 7 quoted lines
> -	struct reftable_ref_record ref = {
> -		.refname = (char *)name,
> +	struct reftable_record rec = {
> +		.type = BLOCK_TYPE_REF,
> +		.u.ref = {
> +			.refname = (char *)name,
> +		},

... yet another style that's a mix between the two. I suppose always putting the braces on their own line is consistent, but for these one-member assignments just doing:

	struct reftable_record rec = {
		.type = BLOCK_TYPE_REF,
		.u.ref = { .refname = (char *)name },
  	};
seems easier to read....
Show 5 quoted lines
> +	struct reftable_record rec = { .type = BLOCK_TYPE_LOG,
> +				       .u.log = {
> +					       .refname = (char *)name,
> +					       .update_index = update_index,
> +				       } };
...ditto (exhaustively wrapped)
Show 13 quoted lines
>  	return merged_table_seek_record(mt, it, &rec);
>  }
>  
> diff --git a/reftable/pq.c b/reftable/pq.c
> index efc474017a2..96ca6dd37b3 100644
> --- a/reftable/pq.c
> +++ b/reftable/pq.c
> @@ -74,6 +74,7 @@ struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq)
>  void merged_iter_pqueue_add(struct merged_iter_pqueue *pq, struct pq_entry e)
>  {
>  	int i = 0;
> +
>  	if (pq->len == pq->cap) {

A stray whitespace change. A good one, but maybe (depending on others in the topic) bundle those into their own patch (or maybe it's not worth it, haven't looked at the whole thing again).

In this case we don't otherwise touch this function, so maybe just leaving it for some future re-formatting change is better?

Show 7 quoted lines
> -		last = ref->refname;
> -		ref->refname = NULL;
> -		reftable_free(ref);
> +		// this is names[i], so don't dealloc.
> +		last = rec->u.ref.refname;
> +		rec->u.ref.refname = NULL;
> +		reftable_record_release(rec);

Per https://lore.kernel.org/git/87wnmwpwyf.fsf@evledraar.gmail.com/ I think Junio at al prefer not to have C++-style comments in git, even though they're also in C99.

>  	}
> -
...more stray whitespace...
Show 12 quoted lines
> [...]
> -	struct reftable_index_record want_index = { .last_key = STRBUF_INIT };
> -	struct reftable_record want_index_rec = { NULL };
> -	struct reftable_index_record index_result = { .last_key = STRBUF_INIT };
> -	struct reftable_record index_result_rec = { NULL };
> +	struct reftable_record want_index = {
> +		.type = BLOCK_TYPE_INDEX, .u.idx = { .last_key = STRBUF_INIT }
> +	};
> +	struct reftable_record index_result = {
> +		.type = BLOCK_TYPE_INDEX,
> +		.u.idx = { .last_key = STRBUF_INIT },
> +	};

Here you are formatting/indenting these struct assignments exactly in the style I suggested above (but within just this patch I think it's the 3rd or 4th style you're using picking).

Show 9 quoted lines
>  	struct table_iter index_iter = TABLE_ITER_INIT;
>  	struct table_iter next = TABLE_ITER_INIT;
>  	int err = 0;
>  
> -	reftable_record_key(rec, &want_index.last_key);
> -	reftable_record_from_index(&want_index_rec, &want_index);
> -	reftable_record_from_index(&index_result_rec, &index_result);
> -
> +	reftable_record_key(rec, &want_index.u.idx.last_key);

Since you're adjusting whitespace that splits blocks for readability, doesn't it mke sense to retain the reftable_record_key() as a "block" here before reader_start(), even if there's only one of them left?

I.e. to split up data setup from "real work" in the function.
Show 13 quoted lines
>  {
> -	struct reftable_ref_record ref = {
> -		.refname = (char *)name,
> +	struct reftable_record rec = {
> +		.type = BLOCK_TYPE_REF,
> +		.u.ref = {
> +			.refname = (char *)name,
> +		},
>  	};
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_ref(&rec, &ref);
>  	return reader_seek(r, it, &rec);
>  }
...more struct formatting...
Show 15 quoted lines
> @@ -607,12 +608,11 @@ int reftable_reader_seek_log_at(struct reftable_reader *r,
>  				struct reftable_iterator *it, const char *name,
>  				uint64_t update_index)
>  {
> -	struct reftable_log_record log = {
> -		.refname = (char *)name,
> -		.update_index = update_index,
> -	};
> -	struct reftable_record rec = { NULL };
> -	reftable_record_from_log(&rec, &log);
> +	struct reftable_record rec = { .type = BLOCK_TYPE_LOG,
> +				       .u.log = {
> +					       .refname = (char *)name,
> +					       .update_index = update_index,
> +				       } };
..ditto...
Show 17 quoted lines
>  	return reader_seek(r, it, &rec);
>  }
>  
> @@ -656,31 +656,33 @@ static int reftable_reader_refs_for_indexed(struct reftable_reader *r,
>  					    struct reftable_iterator *it,
>  					    uint8_t *oid)
>  {
> -	struct reftable_obj_record want = {
> -		.hash_prefix = oid,
> -		.hash_prefix_len = r->object_id_len,
> +	struct reftable_record want = {
> +		.type = BLOCK_TYPE_OBJ,
> +		.u.obj = {
> +			.hash_prefix = oid,
> +			.hash_prefix_len = r->object_id_len,
> +		},
>  	};
..ditto...
Show 63 quoted lines
> -	struct reftable_record want_rec = { NULL };
>  	struct reftable_iterator oit = { NULL };
> -	struct reftable_obj_record got = { NULL };
> -	struct reftable_record got_rec = { NULL };
> +	struct reftable_record got = {
> +		.type = BLOCK_TYPE_OBJ,
> +		.u.obj = { 0 },
> +	};
>  	int err = 0;
>  	struct indexed_table_ref_iter *itr = NULL;
>  
>  	/* Look through the reverse index. */
> -	reftable_record_from_obj(&want_rec, &want);
> -	err = reader_seek(r, &oit, &want_rec);
> +	err = reader_seek(r, &oit, &want);
>  	if (err != 0)
>  		goto done;
>  
>  	/* read out the reftable_obj_record */
> -	reftable_record_from_obj(&got_rec, &got);
> -	err = iterator_next(&oit, &got_rec);
> +	err = iterator_next(&oit, &got);
>  	if (err < 0)
>  		goto done;
>  
> -	if (err > 0 ||
> -	    memcmp(want.hash_prefix, got.hash_prefix, r->object_id_len)) {
> +	if (err > 0 || memcmp(want.u.obj.hash_prefix, got.u.obj.hash_prefix,
> +			      r->object_id_len)) {
>  		/* didn't find it; return empty iterator */
>  		iterator_set_empty(it);
>  		err = 0;
> @@ -688,15 +690,16 @@ static int reftable_reader_refs_for_indexed(struct reftable_reader *r,
>  	}
>  
>  	err = new_indexed_table_ref_iter(&itr, r, oid, hash_size(r->hash_id),
> -					 got.offsets, got.offset_len);
> +					 got.u.obj.offsets,
> +					 got.u.obj.offset_len);
>  	if (err < 0)
>  		goto done;
> -	got.offsets = NULL;
> +	got.u.obj.offsets = NULL;
>  	iterator_from_indexed_table_ref_iter(it, itr);
>  
>  done:
>  	reftable_iterator_destroy(&oit);
> -	reftable_record_release(&got_rec);
> +	reftable_record_release(&got);
>  	return err;
>  }
>  
> diff --git a/reftable/record.c b/reftable/record.c
> index 2a9e41a992e..a8cee628942 100644
> --- a/reftable/record.c
> +++ b/reftable/record.c
> @@ -15,6 +15,10 @@ https://developers.google.com/open-source/licenses/bsd
>  #include "reftable-error.h"
>  #include "basics.h"
>  
> +static struct reftable_record_vtable *
> +reftable_record_vtable(struct reftable_record *rec);
> +static void *reftable_record_data(struct reftable_record *rec);

The reftable_record_data() function can just be moved above its first user, and we can avoid this forward deceleration for a new static function.

> +	if (src->hash_prefix_len)
> +		memcpy(obj->hash_prefix, src->hash_prefix, obj->hash_prefix_len);

Earlier I commented on other mem*() usage, but this goes against the memcpy() paranoia being dropped referenced in the CL. I.e. we can do away with the guard clause here too.

Show 14 quoted lines
> +static void *reftable_record_data(struct reftable_record *rec)
> +{
> +	switch (rec->type) {
> +	case BLOCK_TYPE_REF:
> +		return &rec->u.ref;
> +	case BLOCK_TYPE_LOG:
> +		return &rec->u.log;
> +	case BLOCK_TYPE_INDEX:
> +		return &rec->u.idx;
> +	case BLOCK_TYPE_OBJ:
> +		return &rec->u.obj;
> +	}
> +	abort();
> +}
The static function we forward-declared above, and could just move up.
> +struct reftable_record reftable_new_record(uint8_t typ)
> +{
nit: There's no "type" variable in the below function, so just call this "type"?...
> +	struct reftable_record clean = {
> +		.type = typ,
...only this "type" member, which won't confuse a compiler.
> +	switch (typ) {
...but actually...
Show 29 quoted lines
> +	case BLOCK_TYPE_OBJ:
> +	{
> +		struct reftable_obj_record obj = { 0 };
> +		clean.u.obj = obj;
> +		break;
> +	}
> +	case BLOCK_TYPE_INDEX:
> +	{
> +		struct reftable_index_record idx = {
> +			.last_key = STRBUF_INIT,
> +		};
> +		clean.u.idx = idx;
> +		break;
> +	}
> +	case BLOCK_TYPE_REF:
> +	{
> +		struct reftable_ref_record ref = { 0 };
> +		clean.u.ref = ref;
> +		break;
> +	}
> +	case BLOCK_TYPE_LOG:
> +	{
> +		struct reftable_log_record log = { 0 };
> +		clean.u.log = log;
> +		break;
> +	}
> +	}
> +	return clean;
> +}

...reading this whole function shouldn't this be a more normal *_init() pattern function where the caller just populates the ".type = ", and we init the rest here? That would also make the ownership more obvious, and if any future API user needs to pass in variable on the heap instead of us returning it on the stack here...

> -/* zeroes out the embedded record */
> +/* frees and zeroes out the embedded record */
>  void reftable_record_release(struct reftable_record *rec);
I didn't follow all the vtable entries, but for these:
    
    4 matches for ".release =" in buffer: record.c     
        440:        .release = &reftable_ref_record_release_void,
        582:        .release = &reftable_obj_record_release,
        925:        .release = &reftable_log_record_release_void,
       1052:        .release = &reftable_index_record_release,

Some zero'd the data out already, but for "reftable_index_record_release" isn't promising this a bug, as we don't want to memset() to 0 a strbuf_init()?

Show 8 quoted lines
>  static void test_copy(struct reftable_record *rec)
>  {
> -	struct reftable_record copy =
> -		reftable_new_record(reftable_record_type(rec));
> +	struct reftable_record copy = { 0 };
> +	uint8_t typ;
> +
> +	typ = reftable_record_type(rec);
More odd s/typ/type/

Also for the whitespace here we can just add this assignment above where we declare it.

> [...]
>  		};
> -
>  		int n, m;

Good whitespace change, but another thing to split up in unrelated whitespace fixes...

Show 9 quoted lines
> [...]
>  	struct strbuf key = STRBUF_INIT;
> -	struct reftable_record rec = { NULL };
> -	struct reftable_index_record out = { .last_key = STRBUF_INIT };
> -	struct reftable_record out_rec = { NULL };
> +	struct reftable_record out = {
> +		.type = BLOCK_TYPE_INDEX,
> +		.u.idx = { .last_key = STRBUF_INIT },
> +	};
Another case of different struct formatting (but the one I suggested using uniformly).
Show 6 quoted lines
>  		int err = writer_finish_public_section(w);
> @@ -316,8 +320,6 @@ static int reftable_writer_add_log_verbatim(struct reftable_writer *w,
>  
>  	w->next -= w->pending_padding;
>  	w->pending_padding = 0;
> -
stray whitespace change...
>  	if (arg->err == 0)
>  		goto done;
> -	obj_rec.offset_len = 0;
> +
..stray whitespace change...
> +	rec.u.obj.offset_len = 0;
>  	arg->err = block_writer_add(arg->w->block_writer, &rec);
>  
>  	/* Should be able to write into a fresh block. */
Previous: Han-Wen Nienhuys via GitGitGadgetNext: Han-Wen Nienhuys
Message 140 of 194 in “Reftable coverity fixes”
  1. 00/10 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  2. 01/10 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  3. 02/10 reftable: fix resource leak in error pathHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  4. Derrick StoleeDec 8, 2021
  5. 03/10 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  6. 04/10 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  7. 05/10 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  8. 06/10 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  9. 07/10 reftable: fix NULL derefs in error pathsHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  10. 08/10 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  11. Derrick StoleeDec 8, 2021
  12. 09/10 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  13. 10/10 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  14. Junio C HamanoDec 7, 2021
  15. Jeff KingDec 8, 2021
  16. Junio C HamanoDec 8, 2021
  17. Han-Wen NienhuysDec 8, 2021
  18. Junio C HamanoDec 8, 2021
  19. config.mak.dev: specify -std=gnu99 for gcc/clangJeff King, Dec 8, 2021
  20. Ævar Arnfjörð BjarmasonDec 9, 2021
  21. Jeff KingDec 10, 2021
  22. Derrick StoleeDec 8, 2021
  23. Han-Wen NienhuysDec 8, 2021
  24. Derrick StoleeDec 8, 2021
  25. Han-Wen NienhuysDec 23, 2021
  26. Junio C HamanoDec 8, 2021
  27. Han-Wen NienhuysDec 8, 2021
  28. 00/11 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  29. 01/11 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  30. 02/11 reftable: fix resource leak in error pathHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  31. 03/11 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  32. 04/11 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  33. 05/11 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  34. 06/11 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  35. 07/11 reftable: fix NULL derefs in error pathsHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  36. 08/11 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  37. 09/11 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  38. 10/11 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  39. 11/11 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Dec 8, 2021
  40. Jeff KingDec 9, 2021
  41. 00/11 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  42. 01/11 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  43. 02/11 reftable: fix resource leak in error pathHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  44. Ævar Arnfjörð BjarmasonDec 13, 2021
  45. Han-Wen NienhuysDec 13, 2021
  46. Junio C HamanoDec 13, 2021
  47. 03/11 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  48. 05/11 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  49. 04/11 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  50. 06/11 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  51. 07/11 reftable: fix NULL derefs in error pathsHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  52. Ævar Arnfjörð BjarmasonDec 13, 2021
  53. 08/11 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  54. Ævar Arnfjörð BjarmasonDec 13, 2021
  55. Han-Wen NienhuysDec 13, 2021
  56. Junio C HamanoDec 13, 2021
  57. 10/11 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  58. 09/11 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  59. Ævar Arnfjörð BjarmasonDec 13, 2021
  60. Han-Wen NienhuysDec 13, 2021
  61. 11/11 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Dec 13, 2021
  62. 00/11 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  63. 01/11 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  64. 02/11 reftable: fix resource leak in block.c error pathHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  65. 04/11 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  66. 03/11 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  67. 05/11 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  68. 06/11 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  69. 07/11 reftable: all xxx_free() functions accept NULL argumentsHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  70. 08/11 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  71. 09/11 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  72. 10/11 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  73. 11/11 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Dec 14, 2021
  74. 00/16 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  75. 01/16 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  76. Junio C HamanoDec 22, 2021
  77. Han-Wen NienhuysDec 23, 2021
  78. 02/16 reftable: fix resource leak in block.c error pathHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  79. Junio C HamanoDec 22, 2021
  80. Han-Wen NienhuysDec 23, 2021
  81. Junio C HamanoDec 24, 2021
  82. Han-Wen NienhuysJan 12, 2022
  83. René ScharfeJan 12, 2022
  84. Junio C HamanoJan 13, 2022
  85. Ævar Arnfjörð BjarmasonJan 13, 2022
  86. Han-Wen NienhuysJan 13, 2022
  87. 03/16 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  88. 04/16 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  89. 05/16 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  90. 06/16 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  91. 08/16 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  92. 07/16 reftable: all xxx_free() functions accept NULL argumentsHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  93. 09/16 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  94. 10/16 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  95. Junio C HamanoDec 22, 2021
  96. 11/16 reftable: make reftable-record.h function signatures const correctHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  97. 12/16 reftable: implement record equality genericallyHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  98. 13/16 reftable: remove outdated file reftable.cHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  99. Junio C HamanoDec 22, 2021
  100. Ævar Arnfjörð BjarmasonDec 24, 2021
  101. 15/16 reftable: add print functions to the record typesHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  102. 16/16 reftable: be more paranoid about 0-length memcpy callsHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  103. Junio C HamanoDec 22, 2021
  104. René ScharfeDec 23, 2021
  105. Junio C HamanoDec 23, 2021
  106. René ScharfeDec 26, 2021
  107. Ævar Arnfjörð BjarmasonDec 26, 2021
  108. Han-Wen NienhuysDec 23, 2021
  109. Junio C HamanoDec 24, 2021
  110. Han-Wen NienhuysJan 12, 2022
  111. Han-Wen NienhuysJan 12, 2022
  112. 14/16 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Dec 22, 2021
  113. Junio C HamanoDec 22, 2021
  114. 00/15 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  115. 01/15 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  116. Ævar Arnfjörð BjarmasonJan 21, 2022
  117. Han-Wen NienhuysJan 24, 2022
  118. 02/15 reftable: fix resource leak in block.c error pathHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  119. Ævar Arnfjörð BjarmasonJan 21, 2022
  120. Junio C HamanoJan 22, 2022
  121. 03/15 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  122. 04/15 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  123. Ævar Arnfjörð BjarmasonJan 21, 2022
  124. 06/15 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  125. 05/15 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  126. Ævar Arnfjörð BjarmasonJan 21, 2022
  127. 07/15 reftable: all xxx_free() functions accept NULL argumentsHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  128. 09/15 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  129. 10/15 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  130. 08/15 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  131. 11/15 reftable: make reftable-record.h function signatures const correctHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  132. 12/15 reftable: implement record equality genericallyHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  133. Ævar Arnfjörð BjarmasonJan 21, 2022
  134. 15/15 reftable: add print functions to the record typesHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  135. Ævar Arnfjörð BjarmasonJan 21, 2022
  136. Han-Wen NienhuysJan 24, 2022
  137. 13/15 reftable: remove outdated file reftable.cHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  138. Ævar Arnfjörð BjarmasonJan 21, 2022
  139. 14/15 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Jan 20, 2022
  140. Ævar Arnfjörð BjarmasonJan 21, 2022
  141. Han-Wen NienhuysJan 24, 2022
  142. 00/16 Reftable coverity fixesHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  143. 04/16 reftable: check reftable_stack_auto_compact() return valueHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  144. 12/16 reftable: implement record equality genericallyHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  145. 13/16 reftable: remove outdated file reftable.cHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  146. 09/16 reftable: drop stray printf in readwrite_testHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  147. 16/16 reftable: rename typ to typeHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  148. 02/16 reftable: fix resource leak in block.c error pathHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  149. 03/16 reftable: fix resource leak blocksource.cHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  150. 01/16 reftable: fix OOB stack write in print functionsHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  151. Ævar Arnfjörð BjarmasonJan 24, 2022
  152. 05/16 reftable: ignore remove() return value in stack_test.cHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  153. 06/16 reftable: fix resource warningHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  154. 07/16 reftable: all xxx_free() functions accept NULL argumentsHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  155. 08/16 reftable: order unittests by complexityHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  156. 10/16 reftable: handle null refnames in reftable_ref_record_equalHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  157. 11/16 reftable: make reftable-record.h function signatures const correctHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  158. 15/16 reftable: add print functions to the record typesHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  159. 14/16 reftable: make reftable_record a tagged unionHan-Wen Nienhuys via GitGitGadget, Jan 24, 2022
  160. Ævar Arnfjörð BjarmasonJan 24, 2022
  161. Han-Wen NienhuysJan 24, 2022
  162. Ævar Arnfjörð BjarmasonJan 24, 2022
  163. master doesn't compile on xlc 21.01 anymore (old AIX compiler) (was: [PATCH v7 14/16] reftable: make reftable_record a tagged union)Ævar Arnfjörð Bjarmason, Feb 19, 2022
  164. René ScharfeFeb 19, 2022
  165. reftable: make assignments portable to AIX xlc v12.01Ævar Arnfjörð Bjarmason, Mar 28, 2022
  166. Junio C HamanoMar 28, 2022
  167. Han-Wen NienhuysMar 29, 2022
  168. Junio C HamanoMar 29, 2022
  169. Ævar Arnfjörð BjarmasonJan 24, 2022
  170. brian m. carlsonJan 14, 2022
  171. Ævar Arnfjörð BjarmasonJan 14, 2022
  172. Junio C HamanoJan 14, 2022
  173. Ævar Arnfjörð BjarmasonJan 14, 2022
  174. Junio C HamanoJan 14, 2022
  175. Junio C HamanoJan 14, 2022
  176. Junio C HamanoJan 14, 2022
  177. Ævar Arnfjörð BjarmasonJan 14, 2022
  178. Junio C HamanoJan 15, 2022
  179. Ævar Arnfjörð BjarmasonJan 15, 2022
  180. Junio C HamanoJan 15, 2022
  181. Johannes SchindelinJan 18, 2022
  182. Ævar Arnfjörð BjarmasonJan 18, 2022
  183. Junio C HamanoJan 18, 2022
  184. Ævar Arnfjörð BjarmasonJan 19, 2022
  185. Junio C HamanoJan 19, 2022
  186. Ævar Arnfjörð BjarmasonJan 19, 2022
  187. Junio C HamanoJan 19, 2022
  188. Makefile: FreeBSD cannot do C99-or-below buildJunio C Hamano, Jan 18, 2022
  189. Neeraj SinghJan 18, 2022
  190. Ævar Arnfjörð BjarmasonJan 18, 2022
  191. Junio C HamanoJan 19, 2022
  192. config.mak.dev: fix DEVELOPER=1 on FreeBSD with -std=gnu99Ævar Arnfjörð Bjarmason, Jan 18, 2022
  193. Junio C HamanoJan 18, 2022
  194. Ævar Arnfjörð BjarmasonJan 19, 2022

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.