Skip to content

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

Merged
thaJeztah merged 1 commit into
docker:masterfrom
thaJeztah:nicer_errors
Jul 17, 2024
Merged

cli: FlagErrorFunc: don't print long usage output for invalid flags#5233
thaJeztah merged 1 commit into
docker:masterfrom
thaJeztah:nicer_errors

Conversation

@thaJeztah

@thaJeztahthaJeztah commented Jul 4, 2024

Copy link
Copy Markdown
Member

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

codecov-commenter commented Jul 4, 2024

Copy link
Copy Markdown

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
thaJeztahforce-pushed the nicer_errors branch 4 times, most recently from 86cabc6 to d6a2a4eCompareJuly 5, 2024 01:01
@thaJeztahthaJeztah changed the title cli: FlagErrorFunc: don't print usage output for invalid flagscli: FlagErrorFunc: don't print long usage output for invalid flagsJul 5, 2024
@thaJeztah
thaJeztahforce-pushed the nicer_errors branch 3 times, most recently from 7c4d8aa to 5f0f0ddCompareJuly 5, 2024 09:15
@thaJeztah
thaJeztah marked this pull request as ready for review July 5, 2024 09:47

@krissettokrissetto left a comment

Copy link
Copy Markdown
Contributor

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

Comment threadcli/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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
MemberAuthor

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
Copy Markdown
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 <github@gone.nl>
@thaJeztah

Copy link
Copy Markdown
MemberAuthor

Updated; ptal 👍

Sign up for freeto 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

@thaJeztah@codecov-commenter@krissetto