From: ZheNing Hu <adlternative@xxxxxxxxx> Teach grab_sub_body_contents() return value and err can help us report more useful error messages when when add %(raw:textconv) and %(raw:filter) later. Signed-off-by: ZheNing Hu <adlternative@xxxxxxxxx> --- ref-filter.c | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index 695f6f55e3e3..a859a94aa8e0 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1403,7 +1403,8 @@ static void append_lines(struct strbuf *out, const char *buf, unsigned long size } /* See grab_values */ -static void grab_sub_body_contents(struct atom_value *val, int deref, struct expand_data *data) +static int grab_sub_body_contents(struct atom_value *val, int deref, struct expand_data *data, + struct strbuf *err) { int i; const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL; @@ -1478,6 +1479,7 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct exp } free((void *)sigpos); + return 0; } /* @@ -1501,33 +1503,39 @@ static void fill_missing_values(struct atom_value *val) * pointed at by the ref itself; otherwise it is the object the * ref (which is a tag) refers to. */ -static void grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data) +static int grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data, struct strbuf *err) { void *buf = data->content; + int ret = 0; switch (obj->type) { case OBJ_TAG: grab_tag_values(val, deref, obj); - grab_sub_body_contents(val, deref, data); + if ((ret = grab_sub_body_contents(val, deref, data, err))) + return ret; grab_person("tagger", val, deref, buf); break; case OBJ_COMMIT: grab_commit_values(val, deref, obj); - grab_sub_body_contents(val, deref, data); + if ((ret = grab_sub_body_contents(val, deref, data, err))) + return ret; grab_person("author", val, deref, buf); grab_person("committer", val, deref, buf); break; case OBJ_TREE: /* grab_tree_values(val, deref, obj, buf, sz); */ - grab_sub_body_contents(val, deref, data); + if ((ret = grab_sub_body_contents(val, deref, data, err))) + return ret; break; case OBJ_BLOB: /* grab_blob_values(val, deref, obj, buf, sz); */ - grab_sub_body_contents(val, deref, data); + if ((ret = grab_sub_body_contents(val, deref, data, err))) + return ret; break; default: die("Eh? Object of type %d?", obj->type); } + return ret; } static inline char *copy_advance(char *dst, const char *src) @@ -1725,6 +1733,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj { /* parse_object_buffer() will set eaten to 0 if free() will be needed */ int eaten = 1; + int ret = 0; + if (oi->info.contentp) { /* We need to know that to use parse_object_buffer properly */ oi->info.sizep = &oi->size; @@ -1745,13 +1755,13 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj return strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"), oid_to_hex(&oi->oid), ref->refname); } - grab_values(ref->value, deref, *obj, oi); + ret = grab_values(ref->value, deref, *obj, oi, err); } grab_common_values(ref->value, deref, oi); if (!eaten) free(oi->content); - return 0; + return ret; } static void populate_worktree_map(struct hashmap *map, struct worktree **worktrees) @@ -1805,7 +1815,7 @@ static char *get_worktree_path(const struct used_atom *atom, const struct ref_ar static int populate_value(struct ref_array_item *ref, struct strbuf *err) { struct object *obj; - int i; + int i, ret = 0; struct object_info empty = OBJECT_INFO_INIT; CALLOC_ARRAY(ref->value, used_atom_cnt); @@ -1961,8 +1971,8 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) oi.oid = ref->objectname; - if (get_object(ref, 0, &obj, &oi, err)) - return -1; + if ((ret = get_object(ref, 0, &obj, &oi, err))) + return ret; /* * If there is no atom that wants to know about tagged @@ -1993,9 +2003,11 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err) static int get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom_value **v, struct strbuf *err) { + int ret = 0; + if (!ref->value) { - if (populate_value(ref, err)) - return -1; + if ((ret = populate_value(ref, err))) + return ret; fill_missing_values(ref->value); } *v = &ref->value[atom]; @@ -2568,6 +2580,7 @@ int format_ref_array_item(struct ref_array_item *info, struct strbuf *error_buf) { const char *cp, *sp, *ep; + int ret = 0; struct ref_formatting_state state = REF_FORMATTING_STATE_INIT; state.quote_style = format->quote_style; @@ -2581,10 +2594,10 @@ int format_ref_array_item(struct ref_array_item *info, if (cp < sp) append_literal(cp, sp, &state); pos = parse_ref_filter_atom(format, sp + 2, ep, error_buf); - if (pos < 0 || get_ref_atom_value(info, pos, &atomv, error_buf) || + if (pos < 0 || ((ret = get_ref_atom_value(info, pos, &atomv, error_buf))) || atomv->handler(atomv, &state, error_buf)) { pop_stack_element(&state.stack); - return -1; + return ret ? ret : -1; } } if (*cp) { -- gitgitgadget