On Tue, 2016-09-27 at 01:27 -0400, Jeff King wrote:
> > -static void decode_tree_entry(struct tree_desc *desc, const char *buf,
> > unsigned long size)
> > +static int decode_tree_entry(struct tree_desc *desc, const char *buf,
> > unsigned long size, struct strbuf *err)
> > {
>
> I know we used the "err" strbuf pattern in the ref code, and it makes
> sense there where we have a lot of different functions with public
> interfaces. But here, we literally just feed the result to die() or
> warning(). I wonder if a nicer interface would be:
>
> typedef void (*err_fn)(const char *, ...);
>
> static int decode_tree_entry(struct tree_desc *desc,
> const char *buf, unsigned long size,
> err_fn err)
> {
> ...
> if (size < 23 || buf[size - 21]) {
> err("too-short tree object");
> return -1;
> }
> }
>
> I dunno. Maybe that is overengineering. I guess we only hit the strbufs
> in the error path (which used to die!), so nobody really cares that much
> about the extra allocation.
I don't really like err_fn because:
(a) without a baton, it's somewhat less general (or less thread-safe)
than the strbuf approach and
(b) with a baton, it's two arguments instead of one.
Thanks for all of the rest of the commentary; I've incorporated it and
will re-roll shortly.