Skip to content

Commit

Permalink
check return value of verify_ref_format()
Browse files Browse the repository at this point in the history
Users of the ref-filter code must call verify_ref_format()
before formatting any refs, but most ignore its return
value. This means we may print an error on a syntactically
bogus pattern, but keep going anyway.

In most cases this results in a fatal error when we actually
try to format a ref. But if you have no refs to show at all,
then the behavior is confusing: git prints the error from
verify_ref_format(), then exits with code 0 without showing
any output.  Let's instead abort immediately if we know we
have a bogus format.

We'll output the usage information if we have it handy (just
like the existing call in cmd_for_each_ref() does), and
otherwise just die().

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
peff authored and gitster committed Jul 13, 2017
1 parent 80145b1 commit 2eda010
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 5 deletions.
4 changes: 3 additions & 1 deletion builtin/branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,9 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin

if (!format)
format = to_free = build_format(filter, maxwidth, remote_prefix);
verify_ref_format(format);

if (verify_ref_format(format))
die(_("unable to parse format string"));

ref_array_sort(sorting, &array);

Expand Down
7 changes: 4 additions & 3 deletions builtin/tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
format = "%(refname:lstrip=2)";
}

verify_ref_format(format);
if (verify_ref_format(format))
die(_("unable to parse format string"));
filter->with_commit_tag_algo = 1;
filter_refs(&array, filter, FILTER_REFS_TAGS);
ref_array_sort(sorting, &array);
Expand Down Expand Up @@ -501,8 +502,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
if (cmdmode == 'd')
return for_each_tag_name(argv, delete_tag, NULL);
if (cmdmode == 'v') {
if (format)
verify_ref_format(format);
if (format && verify_ref_format(format))
usage_with_options(git_tag_usage, options);
return for_each_tag_name(argv, verify_tag, format);
}

Expand Down
4 changes: 3 additions & 1 deletion builtin/verify-tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)
flags |= GPG_VERIFY_VERBOSE;

if (fmt_pretty) {
verify_ref_format(fmt_pretty);
if (verify_ref_format(fmt_pretty))
usage_with_options(verify_tag_usage,
verify_tag_options);
flags |= GPG_VERIFY_OMIT_STATUS;
}

Expand Down

0 comments on commit 2eda010

Please sign in to comment.