From: Olga Telezhnaya <olyatelezhnaya@gmail.com> To: git@vger.kernel.org Subject: [PATCH v6 5/6] ref-filter: add return value to parsers Date: Thu, 29 Mar 2018 12:49:45 +0000 Message-ID: <0102016271ce91a9-07b0e717-34fd-46a4-a475-58715a1a038b-000000@eu-west-1.amazonses.com> (raw) In-Reply-To: <0102016271ce90fc-1bd75012-add6-49ee-bb32-66eeeb1cc3df-000000@eu-west-1.amazonses.com> Continue removing die() calls from ref-filter formatting logic, so that it could be used by other commands. Change the signature of parsers by adding return value and strbuf parameter for error message. Return value equals 0 upon success and -1 upon failure. Upon failure, error message is appended to the strbuf. Signed-off-by: Olga Telezhnaia <olyatelezhnaya@gmail.com> --- ref-filter.c | 138 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 89 insertions(+), 49 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index 93fa6b4e5e63d..3f85ef64267d9 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -114,22 +114,25 @@ static int strbuf_addf_ret(struct strbuf *sb, int ret, const char *fmt, ...) return ret; } -static void color_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *color_value) +static int color_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *color_value, struct strbuf *err) { if (!color_value) - die(_("expected format: %%(color:<color>)")); + return strbuf_addf_ret(err, -1, _("expected format: %%(color:<color>)")); if (color_parse(color_value, atom->u.color) < 0) - die(_("unrecognized color: %%(color:%s)"), color_value); + return strbuf_addf_ret(err, -1, _("unrecognized color: %%(color:%s)"), + color_value); /* * We check this after we've parsed the color, which lets us complain * about syntactically bogus color names even if they won't be used. */ if (!want_color(format->use_color)) color_parse("", atom->u.color); + return 0; } -static void refname_atom_parser_internal(struct refname_atom *atom, - const char *arg, const char *name) +static int refname_atom_parser_internal(struct refname_atom *atom, const char *arg, + const char *name, struct strbuf *err) { if (!arg) atom->option = R_NORMAL; @@ -139,16 +142,18 @@ static void refname_atom_parser_internal(struct refname_atom *atom, skip_prefix(arg, "strip=", &arg)) { atom->option = R_LSTRIP; if (strtol_i(arg, 10, &atom->lstrip)) - die(_("Integer value expected refname:lstrip=%s"), arg); + return strbuf_addf_ret(err, -1, _("Integer value expected refname:lstrip=%s"), arg); } else if (skip_prefix(arg, "rstrip=", &arg)) { atom->option = R_RSTRIP; if (strtol_i(arg, 10, &atom->rstrip)) - die(_("Integer value expected refname:rstrip=%s"), arg); + return strbuf_addf_ret(err, -1, _("Integer value expected refname:rstrip=%s"), arg); } else - die(_("unrecognized %%(%s) argument: %s"), name, arg); + return strbuf_addf_ret(err, -1, _("unrecognized %%(%s) argument: %s"), name, arg); + return 0; } -static void remote_ref_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int remote_ref_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { struct string_list params = STRING_LIST_INIT_DUP; int i; @@ -158,9 +163,8 @@ static void remote_ref_atom_parser(const struct ref_format *format, struct used_ if (!arg) { atom->u.remote_ref.option = RR_REF; - refname_atom_parser_internal(&atom->u.remote_ref.refname, - arg, atom->name); - return; + return refname_atom_parser_internal(&atom->u.remote_ref.refname, + arg, atom->name, err); } atom->u.remote_ref.nobracket = 0; @@ -183,29 +187,38 @@ static void remote_ref_atom_parser(const struct ref_format *format, struct used_ atom->u.remote_ref.push_remote = 1; } else { atom->u.remote_ref.option = RR_REF; - refname_atom_parser_internal(&atom->u.remote_ref.refname, - arg, atom->name); + if (refname_atom_parser_internal(&atom->u.remote_ref.refname, + arg, atom->name, err)) { + string_list_clear(¶ms, 0); + return -1; + } } } string_list_clear(¶ms, 0); + return 0; } -static void body_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int body_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { if (arg) - die(_("%%(body) does not take arguments")); + return strbuf_addf_ret(err, -1, _("%%(body) does not take arguments")); atom->u.contents.option = C_BODY_DEP; + return 0; } -static void subject_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int subject_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { if (arg) - die(_("%%(subject) does not take arguments")); + return strbuf_addf_ret(err, -1, _("%%(subject) does not take arguments")); atom->u.contents.option = C_SUB; + return 0; } -static void trailers_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int trailers_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { struct string_list params = STRING_LIST_INIT_DUP; int i; @@ -218,15 +231,20 @@ static void trailers_atom_parser(const struct ref_format *format, struct used_at atom->u.contents.trailer_opts.unfold = 1; else if (!strcmp(s, "only")) atom->u.contents.trailer_opts.only_trailers = 1; - else - die(_("unknown %%(trailers) argument: %s"), s); + else { + strbuf_addf(err, _("unknown %%(trailers) argument: %s"), s); + string_list_clear(¶ms, 0); + return -1; + } } } atom->u.contents.option = C_TRAILERS; string_list_clear(¶ms, 0); + return 0; } -static void contents_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int contents_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { if (!arg) atom->u.contents.option = C_BARE; @@ -238,16 +256,19 @@ static void contents_atom_parser(const struct ref_format *format, struct used_at atom->u.contents.option = C_SUB; else if (skip_prefix(arg, "trailers", &arg)) { skip_prefix(arg, ":", &arg); - trailers_atom_parser(format, atom, *arg ? arg : NULL); + if (trailers_atom_parser(format, atom, *arg ? arg : NULL, err)) + return -1; } else if (skip_prefix(arg, "lines=", &arg)) { atom->u.contents.option = C_LINES; if (strtoul_ui(arg, 10, &atom->u.contents.nlines)) - die(_("positive value expected contents:lines=%s"), arg); + return strbuf_addf_ret(err, -1, _("positive value expected contents:lines=%s"), arg); } else - die(_("unrecognized %%(contents) argument: %s"), arg); + return strbuf_addf_ret(err, -1, _("unrecognized %%(contents) argument: %s"), arg); + return 0; } -static void objectname_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int objectname_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { if (!arg) atom->u.objectname.option = O_FULL; @@ -257,16 +278,18 @@ static void objectname_atom_parser(const struct ref_format *format, struct used_ atom->u.objectname.option = O_LENGTH; if (strtoul_ui(arg, 10, &atom->u.objectname.length) || atom->u.objectname.length == 0) - die(_("positive value expected objectname:short=%s"), arg); + return strbuf_addf_ret(err, -1, _("positive value expected objectname:short=%s"), arg); if (atom->u.objectname.length < MINIMUM_ABBREV) atom->u.objectname.length = MINIMUM_ABBREV; } else - die(_("unrecognized %%(objectname) argument: %s"), arg); + return strbuf_addf_ret(err, -1, _("unrecognized %%(objectname) argument: %s"), arg); + return 0; } -static void refname_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int refname_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { - refname_atom_parser_internal(&atom->u.refname, arg, atom->name); + return refname_atom_parser_internal(&atom->u.refname, arg, atom->name, err); } static align_type parse_align_position(const char *s) @@ -280,7 +303,8 @@ static align_type parse_align_position(const char *s) return -1; } -static void align_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int align_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { struct align *align = &atom->u.align; struct string_list params = STRING_LIST_INIT_DUP; @@ -288,7 +312,7 @@ static void align_atom_parser(const struct ref_format *format, struct used_atom unsigned int width = ~0U; if (!arg) - die(_("expected format: %%(align:<width>,<position>)")); + return strbuf_addf_ret(err, -1, _("expected format: %%(align:<width>,<position>)")); align->position = ALIGN_LEFT; @@ -299,49 +323,65 @@ static void align_atom_parser(const struct ref_format *format, struct used_atom if (skip_prefix(s, "position=", &s)) { position = parse_align_position(s); - if (position < 0) - die(_("unrecognized position:%s"), s); + if (position < 0) { + strbuf_addf(err, _("unrecognized position:%s"), s); + string_list_clear(¶ms, 0); + return -1; + } align->position = position; } else if (skip_prefix(s, "width=", &s)) { - if (strtoul_ui(s, 10, &width)) - die(_("unrecognized width:%s"), s); + if (strtoul_ui(s, 10, &width)) { + strbuf_addf(err, _("unrecognized width:%s"), s); + string_list_clear(¶ms, 0); + return -1; + } } else if (!strtoul_ui(s, 10, &width)) ; else if ((position = parse_align_position(s)) >= 0) align->position = position; - else - die(_("unrecognized %%(align) argument: %s"), s); + else { + strbuf_addf(err, _("unrecognized %%(align) argument: %s"), s); + string_list_clear(¶ms, 0); + return -1; + } } - if (width == ~0U) - die(_("positive width expected with the %%(align) atom")); + if (width == ~0U) { + string_list_clear(¶ms, 0); + return strbuf_addf_ret(err, -1, _("positive width expected with the %%(align) atom")); + } align->width = width; string_list_clear(¶ms, 0); + return 0; } -static void if_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int if_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err) { if (!arg) { atom->u.if_then_else.cmp_status = COMPARE_NONE; - return; + return 0; } else if (skip_prefix(arg, "equals=", &atom->u.if_then_else.str)) { atom->u.if_then_else.cmp_status = COMPARE_EQUAL; } else if (skip_prefix(arg, "notequals=", &atom->u.if_then_else.str)) { atom->u.if_then_else.cmp_status = COMPARE_UNEQUAL; - } else { - die(_("unrecognized %%(if) argument: %s"), arg); - } + } else + return strbuf_addf_ret(err, -1, _("unrecognized %%(if) argument: %s"), arg); + return 0; } -static void head_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg) +static int head_atom_parser(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *unused_err) { atom->u.head = resolve_refdup("HEAD", RESOLVE_REF_READING, NULL, NULL); + return 0; } static struct { const char *name; cmp_type cmp_type; - void (*parser)(const struct ref_format *format, struct used_atom *atom, const char *arg); + int (*parser)(const struct ref_format *format, struct used_atom *atom, + const char *arg, struct strbuf *err); } valid_atom[] = { { "refname" , FIELD_STR, refname_atom_parser }, { "objecttype" }, @@ -468,8 +508,8 @@ static int parse_ref_filter_atom(const struct ref_format *format, } } memset(&used_atom[at].u, 0, sizeof(used_atom[at].u)); - if (valid_atom[i].parser) - valid_atom[i].parser(format, &used_atom[at], arg); + if (valid_atom[i].parser && valid_atom[i].parser(format, &used_atom[at], arg, err)) + return -1; if (*atom == '*') need_tagged = 1; if (!strcmp(valid_atom[i].name, "symref")) -- https://github.com/git/git/pull/466
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 2/4] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-13 19:13 ` Martin Ågren 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 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 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-14 19:04 ` [PATCH v2 2/5] ref-filter: add return value && strbuf to handlers Olga Telezhnaya 2018-03-14 19:04 ` [PATCH v2 4/5] ref-filter: add return value to parsers Olga Telezhnaya 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 3/5] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-19 19:41 ` Junio C Hamano 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-19 13:01 ` [PATCH v3 4/5] ref-filter: add return value to parsers Olga Telezhnaya 2018-03-19 13:01 ` [PATCH v3 5/5] ref-filter: get_ref_atom_value() error handling Olga Telezhnaya 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 3/5] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-20 16:05 ` [PATCH v4 5/5] ref-filter: get_ref_atom_value() " 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 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 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 6/6] ref-filter: libify get_ref_atom_value() 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 2/6] ref-filter: start adding strbufs with errors 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 6/6] ref-filter: libify get_ref_atom_value() 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 4/6] ref-filter: change parsing function error handling Olga Telezhnaya 2018-03-29 12:49 ` Olga Telezhnaya [this message]
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=0102016271ce91a9-07b0e717-34fd-46a4-a475-58715a1a038b-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 list mirror (unofficial, 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 Example config snippet for mirrors 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/ AGPL code for this site: git clone https://public-inbox.org/public-inbox.git