diff --git a/src/builtin.cpp b/src/builtin.cpp index 0a0057eb2..c41dc09d9 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -178,9 +178,14 @@ void builtin_unknown_option(parser_t &parser, io_streams_t &streams, const wchar /// Perform error reporting for encounter with missing argument. void builtin_missing_argument(parser_t &parser, io_streams_t &streams, const wchar_t *cmd, - const wchar_t *opt) { - streams.err.append_format(BUILTIN_ERR_MISSING, cmd, opt + std::wcslen(opt) - 1); - builtin_print_error_trailer(parser, streams.err, cmd); + const wchar_t *opt, bool print_hints) { + if (opt[0] == L'-' && opt[1] != L'-') { + opt += std::wcslen(opt) - 1; + } + streams.err.append_format(BUILTIN_ERR_MISSING, cmd, opt); + if (print_hints) { + builtin_print_error_trailer(parser, streams.err, cmd); + } } /// Print the backtrace and call for help that we use at the end of error messages. diff --git a/src/builtin.h b/src/builtin.h index d6774088c..2d37cbff1 100644 --- a/src/builtin.h +++ b/src/builtin.h @@ -96,7 +96,7 @@ void builtin_unknown_option(parser_t &parser, io_streams_t &streams, const wchar const wchar_t *opt); void builtin_missing_argument(parser_t &parser, io_streams_t &streams, const wchar_t *cmd, - const wchar_t *opt); + const wchar_t *opt, bool print_hints = true); void builtin_print_error_trailer(parser_t &parser, output_stream_t &b, const wchar_t *cmd); diff --git a/src/builtin_argparse.cpp b/src/builtin_argparse.cpp index d93c0a090..3f3c1c43f 100644 --- a/src/builtin_argparse.cpp +++ b/src/builtin_argparse.cpp @@ -550,8 +550,8 @@ static int argparse_parse_flags(parser_t &parser, argparse_cmd_opts_t &opts, wgetopter_t w; while ((opt = w.wgetopt_long(argc, argv, short_options, long_options, &long_idx)) != -1) { if (opt == ':') { - const wchar_t *arg = argv[w.woptind - 1]; - streams.err.append_format(BUILTIN_ERR_MISSING, cmd, arg + std::wcslen(arg) - 1); + builtin_missing_argument(parser, streams, cmd, argv[w.woptind - 1], + false /* print_hints */); return STATUS_INVALID_ARGS; } else if (opt == '?') { // It's not a recognized flag. See if it's an implicit int flag. diff --git a/src/builtin_string.cpp b/src/builtin_string.cpp index ca592e984..3bf7df9f2 100644 --- a/src/builtin_string.cpp +++ b/src/builtin_string.cpp @@ -458,8 +458,8 @@ static int parse_opts(options_t *opts, int *optind, int n_req_args, int argc, wc int retval = fn->second(argv, parser, streams, w, opts); if (retval != STATUS_CMD_OK) return retval; } else if (opt == ':') { - const wchar_t *arg = argv[w.woptind - 1]; - string_error(streams, BUILTIN_ERR_MISSING, cmd, arg + std::wcslen(arg) - 1); + streams.err.append(L"string "); // clone of string_error + builtin_missing_argument(parser, streams, cmd, argv[w.woptind - 1], false /* print_hints */); return STATUS_INVALID_ARGS; } else if (opt == '?') { string_unknown_option(parser, streams, cmd, argv[w.woptind - 1]); diff --git a/tests/checks/argparse.fish b/tests/checks/argparse.fish index e2f3f3a21..5c9ca8ec6 100644 --- a/tests/checks/argparse.fish +++ b/tests/checks/argparse.fish @@ -307,3 +307,6 @@ end # #6483 - error messages for missing arguments argparse -n foo q r/required= -- foo -qr # CHECKERR: foo: Expected argument for option r + +argparse r/required= -- foo --required +# CHECKERR: argparse: Expected argument for option --required