Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cli: FlagErrorFunc: don't print long usage output for invalid flags #5233

Merged
merged 1 commit into from
Jul 17, 2024

Conversation

thaJeztah
Copy link
Member

@thaJeztah thaJeztah commented Jul 4, 2024

cli: FlagErrorFunc: don't print usage output for invalid flags

When trying to use an invalid flag, the CLI currently prints the a short
error message, instructions to use the --help flag to learn about the
correct usage, followed by the command's usage output.

While this is a common convention, and may have been a nice gesture when
docker was still young and only had a few commands and options ("you did
something wrong, but here's an overview of what you can use"), that's no
longer the case, and many commands have a very long output.

The result of this is that the error message, which is the relevant
information in this case - "You mis-typed something" - is lost in the
output, and hard to find (sometimes even requiring scrolling back).

The output is also confusing, because it looks like something ran
successfully (most of the output is not about the error!).

Even further; the suggested resolution (try --help to see the correct
options) is rather redundant, because running teh command with --help
produces exactly the same output as was just showh, baring the error
message. As a fun fact, due to the usage output being printed, the
output even contains not one, but two "call to actions";

  • See 'docker volume --help'. (under the erro message)
  • Run 'docker volume COMMAND --help' for more information on a command.
    (under the usage output)

In short; the output is too verbose, confusing, and doesn't provide
a good UX. Let's reduce the output produced so that the focus is on the
important information.

This patch:

  • Changes the usage to the short-usage.
  • Prefixes the error message with the binary / root-command name
    (usually docker:) to be consistent with unknon command, and helps
    to distinguish where the message originated from (the docker CLI in
    this case).
  • Adds an empty line between the error-message and the "call to action"
    (Run 'docker volume --help' ... in the example below). This helps
    separating the error message ("unkown flag") from the call-to-action.

Before this patch:

docker volume --no-such-flag
unknown flag: --no-such-flag
See 'docker volume --help'.

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove unused local volumes
  rm          Remove one or more volumes
  update      Update a volume (cluster volumes only)

Run 'docker volume COMMAND --help' for more information on a command.

With this patch:

docker volume --no-such-flag
docker: unknown flag: --no-such-flag

Usage:  docker volume COMMAND

Run 'docker volume --help' for more information

- Description for the changelog

Improve error-output for invalid flags on the command-line.

- A picture of a cute animal (not mandatory but encouraged)

@codecov-commenter
Copy link

codecov-commenter commented Jul 4, 2024

Codecov Report

Attention: Patch coverage is 0% with 1 line in your changes missing coverage. Please review.

Project coverage is 61.44%. Comparing base (ce4469a) to head (f28fc7f).

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #5233      +/-   ##
==========================================
- Coverage   61.44%   61.44%   -0.01%     
==========================================
  Files         298      298              
  Lines       20824    20821       -3     
==========================================
- Hits        12796    12794       -2     
+ Misses       7113     7112       -1     
  Partials      915      915              

@thaJeztah thaJeztah force-pushed the nicer_errors branch 4 times, most recently from 86cabc6 to d6a2a4e Compare July 5, 2024 01:01
@thaJeztah thaJeztah changed the title cli: FlagErrorFunc: don't print usage output for invalid flags cli: FlagErrorFunc: don't print long usage output for invalid flags Jul 5, 2024
@thaJeztah thaJeztah force-pushed the nicer_errors branch 3 times, most recently from 7c4d8aa to 5f0f0dd Compare July 5, 2024 09:15
@thaJeztah thaJeztah marked this pull request as ready for review July 5, 2024 09:47
@thaJeztah thaJeztah requested review from krissetto and Benehiko July 16, 2024 23:24
Copy link
Contributor

@krissetto krissetto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overall lgtm, check the comments

cli/cobra.go Outdated
return StatusError{
Status: fmt.Sprintf("%s\nSee '%s --help'.%s", err, cmd.CommandPath(), usage),
Status: fmt.Sprintf("%[2]s\n\nUsage: %[3]s\n\nRun '%[4]s --help' for more information", cmd.Root().Name(), err, cmd.UseLine(), cmd.CommandPath()),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: there are 2 spaces after Usage:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, is cmd.Root().Name() being used?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: there are 2 spaces after Usage:

Yes, it looked like we're using 2 spaces for that everywhere; ISTR those may have been a <tab> in the past, which screwed up generating our YAML-docs, and were replaced; we should make a pass at checking where all of those are produced, and consider changing to a single one 🙈

docker --nosuch 2>&1 >/dev/null | grep Usage
Usage:  docker [OPTIONS] COMMAND

Also, is cmd.Root().Name() being used?

Oh! Good one; I don't think it is anymore! I went through a couple of iterations; one of them was including docker: as prefix, but I went back-and-forth on whether that made things clearer, as it would look like (e.g.);

docker: Usage:  docker [OPTIONS] COMMAND

Which felt just too verbose and somewhat confusing, so in the end I removed that.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OH, i didn't realize we double-space in multiple areas 🙈 no problem!

When trying to use an invalid flag, the CLI currently prints the a short
error message, instructions to use the `--help` flag to learn about the
correct usage, followed by the command's usage output.

While this is a common convention, and may have been a nice gesture when
docker was still young and only had a few commands and options ("you did
something wrong, but here's an overview of what you can use"), that's no
longer the case, and many commands have a _very_ long output.

The result of this is that the error message, which is the relevant
information in this case - "You mis-typed something" - is lost in the
output, and hard to find (sometimes even requiring scrolling back).

The output is also confusing, because it _looks_ like something ran
successfully (most of the output is not about the error!).

Even further; the suggested resolution (try `--help` to see the correct
options) is rather redundant, because running teh command with `--help`
produces _exactly_ the same output as was just showh, baring the error
message. As a fun fact, due to the usage output being printed, the
output even contains not one, but _two_ "call to actions";

- `See 'docker volume --help'.` (under the erro message)
- `Run 'docker volume COMMAND --help' for more information on a command.`
  (under the usage output)

In short; the output is too verbose, confusing, and doesn't provide
a good UX. Let's reduce the output produced so that the focus is on the
important information.

This patch:

- Changes the usage to the short-usage.
- Prefixes the error message with the binary / root-command name
  (usually `docker:`) to be consistent with `unknon command`, and helps
  to distinguish where the message originated from (the `docker` CLI in
  this case).
- Adds an empty line between the error-message and the "call to action"
  (`Run 'docker volume --help' ...` in the example below). This helps
  separating the error message ("unkown flag") from the call-to-action.

Before this patch:

    docker volume --no-such-flag
    unknown flag: --no-such-flag
    See 'docker volume --help'.

    Usage:  docker volume COMMAND

    Manage volumes

    Commands:
      create      Create a volume
      inspect     Display detailed information on one or more volumes
      ls          List volumes
      prune       Remove unused local volumes
      rm          Remove one or more volumes
      update      Update a volume (cluster volumes only)

    Run 'docker volume COMMAND --help' for more information on a command.

With this patch:

    docker volume --no-such-flag
    docker: unknown flag: --no-such-flag

    Usage:  docker volume COMMAND

    Run 'docker volume --help' for more information

Signed-off-by: Sebastiaan van Stijn <[email protected]>
@thaJeztah
Copy link
Member Author

Updated; ptal 👍

@thaJeztah thaJeztah merged commit 05a8081 into docker:master Jul 17, 2024
88 checks passed
@thaJeztah thaJeztah deleted the nicer_errors branch July 17, 2024 12:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants