On Tue, Mar 20, 2018 at 12:05 PM, Olga Telezhnaya
<[email protected]> wrote:
> ref-filter: get_ref_atom_value() error handling
This doesn't tell us much about what this patch is doing. Perhaps a
better subject would be:
ref-filter: libify get_ref_atom_value()
> Finish removing die() calls from ref-filter formatting logic,
> so that it could be used by other commands.
>
> Change the signature of get_ref_atom_value() and underlying functions
> by adding return value and strbuf parameter for error message.
> Return value equals 0 upon success and -1 upon failure (there
> could be more error codes further if necessary).
> Upon failure, error message is appended to the strbuf.
>
> Signed-off-by: Olga Telezhnaia <[email protected]>
> ---
> diff --git a/ref-filter.c b/ref-filter.c
> @@ -1445,28 +1445,36 @@ static const char *get_refname(struct used_atom
> *atom, struct ref_array_item *re
> +static int get_object(struct ref_array_item *ref, const struct object_id
> *oid,
> + int deref, struct object **obj, struct strbuf *err)
> {
> void *buf = get_obj(oid, obj, &size, &eaten);
> - if (!buf)
> - die(_("missing object %s for %s"),
> - oid_to_hex(oid), ref->refname);
> - if (!*obj)
> - die(_("parse_object_buffer failed on %s for %s"),
> - oid_to_hex(oid), ref->refname);
> -
> + if (!buf) {
> + strbuf_addf(err, _("missing object %s for %s"),
> oid_to_hex(oid),
> + ref->refname);
> + if (!eaten)
> + free(buf);
Since we are inside the 'if (!buf)' conditional, we _know_ that 'buf'
is NULL, therefore this free(buff) is unnecessary.
> + return -1;
> + }
> + if (!*obj) {
> + strbuf_addf(err, _("parse_object_buffer failed on %s for %s"),
> + oid_to_hex(oid), ref->refname);
> + if (!eaten)
> + free(buf);
> + return -1;
> + }
> grab_values(ref->value, deref, *obj, buf, size);
> if (!eaten)
> free(buf);
> + return 0;
> }
Overall, with the need for resource cleanup, this function becomes
unusually noisy after this change. It could be tamed by doing
something like this:
int ret = 0;
void *buf = get_obj(oid, obj, &size, &eaten);
if (!buf)
ret = strbuf_error(_("missing object %s for %s"),
oid_to_hex(oid), ref->refname);
else if (!*obj)
ret = strbuf_error(_("parse_object_buffer failed on %s for %s"),
oid_to_hex(oid), ref->refname);
else
grab_values(ref->value, deref, *obj, buf, size);
if (!eaten)
free(buf);
return ret;