Continue removing any printing from ref-filter formatting logic,
so that it could be more general.

Change the signature of parsers by adding return value and
strbuf parameter for error message.

Signed-off-by: Olga Telezhnaia <olyatelezhn...@gmail.com>
---
 ref-filter.c | 177 +++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 118 insertions(+), 59 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index e146215bf1e64..06eb95e7c2c07 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -101,22 +101,28 @@ static struct used_atom {
 } *used_atom;
 static int used_atom_cnt, need_tagged, need_symref;
 
-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>)"));
-       if (color_parse(color_value, atom->u.color) < 0)
-               die(_("unrecognized color: %%(color:%s)"), color_value);
+       if (!color_value) {
+               strbuf_addstr(err, _("expected format: %(color:<color>)"));
+               return -1;
+       }
+       if (color_parse(color_value, atom->u.color) < 0) {
+               strbuf_addf(err, _("unrecognized color: %%(color:%s)"), 
color_value);
+               return -1;
+       }
        /*
         * 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;
@@ -125,17 +131,25 @@ static void refname_atom_parser_internal(struct 
refname_atom *atom,
        else if (skip_prefix(arg, "lstrip=", &arg) ||
                 skip_prefix(arg, "strip=", &arg)) {
                atom->option = R_LSTRIP;
-               if (strtol_i(arg, 10, &atom->lstrip))
-                       die(_("Integer value expected refname:lstrip=%s"), arg);
+               if (strtol_i(arg, 10, &atom->lstrip)) {
+                       strbuf_addf(err, _("Integer value expected 
refname:lstrip=%s"), arg);
+                       return -1;
+               }
        } 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);
-       } else
-               die(_("unrecognized %%(%s) argument: %s"), name, arg);
+               if (strtol_i(arg, 10, &atom->rstrip)) {
+                       strbuf_addf(err, _("Integer value expected 
refname:rstrip=%s"), arg);
+                       return -1;
+               }
+       } else {
+               strbuf_addf(err, _("unrecognized %%(%s) argument: %s"), name, 
arg);
+               return -1;
+       }
+       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;
@@ -145,9 +159,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;
@@ -170,29 +183,40 @@ 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))
+                               return -1;
                }
        }
 
        string_list_clear(&params, 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"));
+       if (arg) {
+               strbuf_addstr(err, _("%(body) does not take arguments"));
+               return -1;
+       }
        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"));
+       if (arg) {
+               strbuf_addstr(err, _("%(subject) does not take arguments"));
+               return -1;
+       }
        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;
@@ -205,15 +229,19 @@ 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);
+                               return -1;
+                       }
                }
        }
        atom->u.contents.option = C_TRAILERS;
        string_list_clear(&params, 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;
@@ -225,16 +253,23 @@ 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);
-       } else
-               die(_("unrecognized %%(contents) argument: %s"), arg);
+               if (strtoul_ui(arg, 10, &atom->u.contents.nlines)) {
+                       strbuf_addf(err, _("positive value expected 
contents:lines=%s"), arg);
+                       return -1;
+               }
+       } else {
+               strbuf_addf(err, _("unrecognized %%(contents) argument: %s"), 
arg);
+               return -1;
+       }
+       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;
@@ -243,17 +278,23 @@ static void objectname_atom_parser(const struct 
ref_format *format, struct used_
        else if (skip_prefix(arg, "short=", &arg)) {
                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);
+                   atom->u.objectname.length == 0) {
+                       strbuf_addf(err, _("positive value expected 
objectname:short=%s"), arg);
+                       return -1;
+               }
                if (atom->u.objectname.length < MINIMUM_ABBREV)
                        atom->u.objectname.length = MINIMUM_ABBREV;
-       } else
-               die(_("unrecognized %%(objectname) argument: %s"), arg);
+       } else {
+               strbuf_addf(err, _("unrecognized %%(objectname) argument: %s"), 
arg);
+               return -1;
+       }
+       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)
@@ -267,15 +308,18 @@ 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;
        int i;
        unsigned int width = ~0U;
 
-       if (!arg)
-               die(_("expected format: %%(align:<width>,<position>)"));
+       if (!arg) {
+               strbuf_addstr(err, _("expected format: 
%(align:<width>,<position>)"));
+               return -1;
+       }
 
        align->position = ALIGN_LEFT;
 
@@ -286,49 +330,64 @@ 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);
+                               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);
+                               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);
+                       return -1;
+               }
        }
 
-       if (width == ~0U)
-               die(_("positive width expected with the %%(align) atom"));
+       if (width == ~0U) {
+               strbuf_addstr(err, _("positive width expected with the %(align) 
atom"));
+               return -1;
+       }
        align->width = width;
        string_list_clear(&params, 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);
+               strbuf_addf(err, _("unrecognized %%(if) argument: %s"), arg);
+               return -1;
        }
+       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 *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" },
@@ -459,8 +518,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

Reply via email to