From: Olga Telezhnaya <olyatelezhnaya@gmail.com> To: git@vger.kernel.org Subject: [PATCH v3 5/5] ref-filter: get_ref_atom_value() error handling Date: Mon, 19 Mar 2018 13:01:00 +0000 Message-ID: <010201623e5944b3-9397c866-0bd8-4a03-863a-5c87a486e7b2-000000@eu-west-1.amazonses.com> (raw) In-Reply-To: <010201623e594401-906aa5ca-545b-405a-810a-607491fe09a7-000000@eu-west-1.amazonses.com> Finish removing any printing from ref-filter formatting logic, so that it could be more general. Change the signature of get_ref_atom_value() and underlying functions by adding return value and strbuf parameter for error message. Some die() calls are left; all of them are not for users, but for Git developers. Signed-off-by: Olga Telezhnaia <olyatelezhnaya@gmail.com> --- ref-filter.c | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index b90cec1056954..85f971663a4aa 100644 --- 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 return show_ref(&atom->u.refname, ref->refname); } -static void get_object(struct ref_array_item *ref, const struct object_id *oid, - int deref, struct object **obj) +static int get_object(struct ref_array_item *ref, const struct object_id *oid, + int deref, struct object **obj, struct strbuf *err) { int eaten; unsigned long size; 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); + 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; } /* * Parse the object referred by ref, and grab needed value. */ -static void populate_value(struct ref_array_item *ref) +static int populate_value(struct ref_array_item *ref, struct strbuf *err) { struct object *obj; int i; @@ -1588,16 +1596,17 @@ static void populate_value(struct ref_array_item *ref) break; } if (used_atom_cnt <= i) - return; + return 0; - get_object(ref, &ref->objectname, 0, &obj); + if (get_object(ref, &ref->objectname, 0, &obj, err)) + return -1; /* * If there is no atom that wants to know about tagged * object, we are done. */ if (!need_tagged || (obj->type != OBJ_TAG)) - return; + return 0; /* * If it is a tag object, see if we use a value that derefs @@ -1611,20 +1620,23 @@ static void populate_value(struct ref_array_item *ref) * is not consistent with what deref_tag() does * which peels the onion to the core. */ - get_object(ref, tagged, 1, &obj); + return get_object(ref, tagged, 1, &obj, err); } /* * Given a ref, return the value for the atom. This lazily gets value * out of the object by calling populate value. */ -static void get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom_value **v) +static int get_ref_atom_value(struct ref_array_item *ref, int atom, + struct atom_value **v, struct strbuf *err) { if (!ref->value) { - populate_value(ref); + if (populate_value(ref, err)) + return -1; fill_missing_values(ref->value); } *v = &ref->value[atom]; + return 0; } /* @@ -2148,9 +2160,13 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru int cmp; cmp_type cmp_type = used_atom[s->atom].type; int (*cmp_fn)(const char *, const char *); + struct strbuf err = STRBUF_INIT; - get_ref_atom_value(a, s->atom, &va); - get_ref_atom_value(b, s->atom, &vb); + if (get_ref_atom_value(a, s->atom, &va, &err)) + die("%s", err.buf); + if (get_ref_atom_value(b, s->atom, &vb, &err)) + die("%s", err.buf); + strbuf_release(&err); cmp_fn = s->ignore_case ? strcasecmp : strcmp; if (s->version) cmp = versioncmp(va->s, vb->s); @@ -2230,7 +2246,8 @@ int format_ref_array_item(struct ref_array_item *info, pos = parse_ref_filter_atom(format, sp + 2, ep, error_buf); if (pos < 0) return -1; - get_ref_atom_value(info, pos, &atomv); + if (get_ref_atom_value(info, pos, &atomv, error_buf)) + return -1; if (atomv->handler(atomv, &state, error_buf)) return -1; } -- https://github.com/git/git/pull/466
next prev parent reply index Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-03-13 10:16 [RFC 1/4] ref-filter: start adding strbufs with errors Olga Telezhnaya 2018-03-13 10:16 ` [RFC 3/4] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-13 19:18 ` Martin Ågren 2018-03-14 13:36 ` Оля Тележная 2018-03-13 10:16 ` [RFC 4/4] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-13 10:16 ` [RFC 2/4] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-13 19:13 ` Martin Ågren 2018-03-13 19:12 ` [RFC 1/4] ref-filter: start adding strbufs with errors Martin Ågren 2018-03-14 13:30 ` Оля Тележная 2018-03-14 19:04 ` [PATCH v2 1/5] " Olga Telezhnaya 2018-03-14 19:04 ` [PATCH v2 4/5] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-14 19:04 ` [PATCH v2 2/5] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-14 19:04 ` [PATCH v2 5/5] ref-filter: get_ref_atom_value() error handling Olga Telezhnaya 2018-03-15 20:47 ` Martin Ågren 2018-03-15 21:01 ` Eric Sunshine 2018-03-16 7:20 ` Оля Тележная 2018-03-15 21:05 ` Junio C Hamano 2018-03-16 7:17 ` Оля Тележная 2018-03-14 19:04 ` [PATCH v2 3/5] ref-filter: change parsing function " Olga Telezhnaya 2018-03-15 22:48 ` Junio C Hamano 2018-03-16 7:22 ` Оля Тележная 2018-03-19 13:01 ` [PATCH v3 1/5] ref-filter: start adding strbufs with errors Olga Telezhnaya 2018-03-19 13:01 ` [PATCH v3 4/5] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-19 13:01 ` [PATCH v3 3/5] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-19 19:41 ` Junio C Hamano 2018-03-19 13:01 ` Olga Telezhnaya [this message] 2018-03-19 13:01 ` [PATCH v3 2/5] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-19 19:24 ` Junio C Hamano 2018-03-20 16:05 ` [PATCH v4 1/5] ref-filter: start adding strbufs with errors Olga Telezhnaya 2018-03-20 16:05 ` [PATCH v4 2/5] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-20 18:18 ` Eric Sunshine 2018-03-20 16:05 ` [PATCH v4 5/5] ref-filter: get_ref_atom_value() error handling Olga Telezhnaya 2018-03-20 18:19 ` Eric Sunshine 2018-03-20 22:30 ` Junio C Hamano 2018-03-20 22:50 ` Eric Sunshine 2018-03-21 19:30 ` Junio C Hamano 2018-03-21 19:58 ` Eric Sunshine 2018-03-20 16:05 ` [PATCH v4 3/5] ref-filter: change parsing function " Olga Telezhnaya 2018-03-20 16:05 ` [PATCH v4 4/5] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-21 18:28 ` [PATCH v5 1/6] strbuf: add shortcut to work with error messages Olga Telezhnaya 2018-03-21 18:28 ` [PATCH v5 3/6] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-21 18:28 ` [PATCH v5 5/6] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-21 18:28 ` [PATCH v5 4/6] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-21 20:36 ` Junio C Hamano 2018-03-23 6:56 ` Оля Тележная 2018-03-21 18:28 ` [PATCH v5 2/6] ref-filter: start adding strbufs with errors Olga Telezhnaya 2018-03-21 18:28 ` [PATCH v5 6/6] ref-filter: libify get_ref_atom_value() Olga Telezhnaya 2018-03-21 20:20 ` [PATCH v5 1/6] strbuf: add shortcut to work with error messages Junio C Hamano 2018-03-23 6:48 ` Оля Тележная 2018-03-29 12:49 ` [PATCH v6 1/6] ref-filter: add shortcut to work with strbufs Olga Telezhnaya 2018-03-29 12:49 ` [PATCH v6 2/6] ref-filter: start adding strbufs with errors Olga Telezhnaya 2018-03-29 12:49 ` [PATCH v6 3/6] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-29 12:49 ` [PATCH v6 6/6] ref-filter: libify get_ref_atom_value() Olga Telezhnaya 2018-03-29 12:49 ` [PATCH v6 4/6] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-29 12:49 ` [PATCH v6 5/6] ref-filter: add return value to parsers Olga Telezhnaya
Reply instructions: You may reply publically to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: http://vger.kernel.org/majordomo-info.html * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=010201623e5944b3-9397c866-0bd8-4a03-863a-5c87a486e7b2-000000@eu-west-1.amazonses.com \ --to=olyatelezhnaya@gmail.com \ --cc=git@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
git@vger.kernel.org mailing list mirror (one of many) Archives are clonable: git clone --mirror https://public-inbox.org/git git clone --mirror http://ou63pmih66umazou.onion/git git clone --mirror http://czquwvybam4bgbro.onion/git git clone --mirror http://hjrcffqmbrq6wope.onion/git Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.version-control.git nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git nntp://news.gmane.org/gmane.comp.version-control.git note: .onion URLs require Tor: https://www.torproject.org/ or Tor2web: https://www.tor2web.org/ AGPL code for this site: git clone https://public-inbox.org/ public-inbox