On Fri, Aug 21, 2020 at 6:11 AM Hariom Verma via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > The 'contents' atom does not show any error if used with 'trailers' > atom and semicolon is missing before trailers arguments. Do you mean s/semicolon/colon/ ? > e.g %(contents:trailersonly) works, while it shouldn't. > > It is definitely not an expected behavior. > > Let's fix this bug. > > Signed-off-by: Hariom Verma <hariom18599@xxxxxxxxx> > --- > diff --git a/ref-filter.c b/ref-filter.c > @@ -332,6 +332,22 @@ static int trailers_atom_parser(const struct ref_format *format, struct used_ato > +static int check_format_field(const char *arg, const char *field, const char **option) > +{ > + const char *opt; > + if (skip_prefix(arg, field, &opt)) { > + if (*opt == '\0') { > + *option = NULL; > + return 1; > + } > + else if (*opt == ':') { > + *option = opt + 1; > + return 1; > + } > + } > + return 0; > +} Not necessarily worth a re-roll, but rather than introducing all the above new code... > @@ -345,9 +361,8 @@ static int contents_atom_parser(const struct ref_format *format, struct used_ato > - else if (skip_prefix(arg, "trailers", &arg)) { > - skip_prefix(arg, ":", &arg); > - if (trailers_atom_parser(format, atom, *arg ? arg : NULL, err)) > + else if (check_format_field(arg, "trailers", &arg)) { > + if (trailers_atom_parser(format, atom, arg, err)) > return -1; ...an alternative would have been something like: else if (!strcmp(arg, "trailers")) { if (trailers_atom_parser(format, atom, NULL, err)) return -1; } else if (skip_prefix(arg, "trailers:", &arg)) { if (trailers_atom_parser(format, atom, arg, err)) return -1; } which is quite simple to reason about (though has the cost of a tiny bit of duplication). > diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh > @@ -823,6 +823,15 @@ test_expect_success '%(trailers) rejects unknown trailers arguments' ' > +test_expect_success 'if arguments, %(contents:trailers) shows error if semicolon is missing' ' s/semicolon/colon/ > + # error message cannot be checked under i18n What is this comment about? I realize that you copied it from other nearby tests, but I find that it muddies rather than clarifies. > + cat >expect <<-EOF && > + fatal: unrecognized %(contents) argument: trailersonly > + EOF > + test_must_fail git for-each-ref --format="%(contents:trailersonly)" 2>actual && > + test_i18ncmp expect actual > +'