Skip to content

Commit

Permalink
btrfs-progs: help: recognize --help option among other options
Browse files Browse the repository at this point in the history
There's a report that handling of --help in connection with other option
is confusing in some cases:

Various sub-commands to btrfs claim --help is an unrecognized option if
there are any other options on the CLI.

Examples of --help being unrecognized.

  $ btrfs filesystem defragment -v --help
  btrfs filesystem defragment: unrecognized option '--help'
  Try 'btrfs filesystem defragment --help' for more information

  $ btrfs balance start -v --help
  $ btrfs balabtrfs balance start -v --help
  btrfs balance start: unrecognized option '--help'
  Try 'btrfs balance start --help' for more information

Alternatively, some sub-commands support --help even if there are extra
options on the CLI:

  $ btrfs filesystem df -v --help
  usage: btrfs filesystem df [options] <path>

      Show space usage information for a mount point

      -b|--raw                  raw numbers in bytes
      -h|--human-readable       human friendly numbers, base 1024 (default)
      -H                        human friendly numbers, base 1000
      --iec                     use 1024 as a base (KiB, MiB, GiB, TiB)
      --si                      use 1000 as a base (kB, MB, GB, TB)
      -k|--kbytes               show sizes in KiB, or kB with --si
      -m|--mbytes               show sizes in MiB, or MB with --si
      -g|--gbytes               show sizes in GiB, or GB with --si
      -t|--tbytes               show sizes in TiB, or TB with --si

      Global options:
      --format TYPE             where TYPE is: text

Update clean_args_no_options() to detect unrecognized options properly
and do not show full help text (which usued to be done in the past but
is confusing and not pointing to the problem).

There's also a mixup of global verbosity options and command-specific
verbosity options (now deprecated), so in some commands they are
recognized.

Also handle the --help option for commands without options so the
following works:

  $ btrfs fi df -v --help /
  btrfs filesystem df: invalid option 'v'
  Try 'btrfs filesystem df --help' for more information

  $ btrfs fi df -H --help /
  usage: btrfs filesystem df [options] <path>

      Show space usage information for a mount point

      -b|--raw                  raw numbers in byte
  ...

Issue: #889
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
kdave committed Jan 28, 2025
1 parent 7039392 commit f450a8a
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions common/help.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,14 @@ int check_argc_max(int nargs, int expected)
/*
* Preprocess @argv with getopt_long to reorder options and consume the "--"
* option separator.
* Unknown short and long options are reported, optionally the @usage is printed
* before exit.
* Unknown short and long options are reported. Also consume the --help
* option in case it's for a command without any options.
*/
void clean_args_no_options(const struct cmd_struct *cmd, int argc, char *argv[])
{
static const struct option long_options[] = {
{NULL, 0, NULL, 0}
{ "help", no_argument, NULL, GETOPT_VAL_HELP },
{ NULL, 0, NULL, 0 }
};

while (1) {
Expand All @@ -103,9 +104,13 @@ void clean_args_no_options(const struct cmd_struct *cmd, int argc, char *argv[])
break;

switch (c) {
default:
case GETOPT_VAL_HELP:
if (cmd->usagestr)
usage(cmd, 1);
break;
default:
if (cmd->usagestr)
usage_unknown_option(cmd, argv);
}
}
}
Expand Down

0 comments on commit f450a8a

Please sign in to comment.