From: Hariom Verma via GitGitGadget Date: Wed, 19 Aug 2020 12:52:31 GMT Subject: [PATCH 2/2] ref-filter: 'contents:trailers' show error if `:` is missing Message-ID: <7daf9335a501b99c29e299f72823fcb7e549e748.1597841551.git.gitgitgadget@gmail.com> In-Reply-To: From: Hariom Verma The 'contents' atom does not show any error if used with 'trailers' atom and semicolon is missing before trailers arguments. e.g %(contents:trailersonly) works, while it shouldn't. It is definitely not an expected behavior. Let's fix this bug. Mentored-by: Christian Couder Mentored-by: Heba Waly Signed-off-by: Hariom Verma --- ref-filter.c | 21 ++++++++++++++++++--- t/t6300-for-each-ref.sh | 9 +++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index ba85869755..dc31fbbe51 100644 --- 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 return 0; } +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; + return 1; + } + } + return 0; +} + static int contents_atom_parser(const struct ref_format *format, struct used_atom *atom, const char *arg, struct strbuf *err) { @@ -345,9 +361,8 @@ static int contents_atom_parser(const struct ref_format *format, struct used_ato atom->u.contents.option = C_SIG; else if (!strcmp(arg, "subject")) atom->u.contents.option = C_SUB; - 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; } else if (skip_prefix(arg, "lines=", &arg)) { atom->u.contents.option = C_LINES; diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 495848c881..cb1508cef5 100755 --- 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_i18ncmp expect actual ' +test_expect_success 'if arguments, %(contents:trailers) shows error if semicolon is missing' ' + # error message cannot be checked under i18n + 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 +' + test_expect_success 'basic atom: head contents:trailers' ' git for-each-ref --format="%(contents:trailers)" refs/heads/master >actual && sanitize_pgp actual.clean && -- gitgitgadget