Skip to content

Commit f450a8a

Browse files
committed
btrfs-progs: help: recognize --help option among other options
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 <[email protected]>
1 parent 7039392 commit f450a8a

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

Diff for: common/help.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,14 @@ int check_argc_max(int nargs, int expected)
8787
/*
8888
* Preprocess @argv with getopt_long to reorder options and consume the "--"
8989
* option separator.
90-
* Unknown short and long options are reported, optionally the @usage is printed
91-
* before exit.
90+
* Unknown short and long options are reported. Also consume the --help
91+
* option in case it's for a command without any options.
9292
*/
9393
void clean_args_no_options(const struct cmd_struct *cmd, int argc, char *argv[])
9494
{
9595
static const struct option long_options[] = {
96-
{NULL, 0, NULL, 0}
96+
{ "help", no_argument, NULL, GETOPT_VAL_HELP },
97+
{ NULL, 0, NULL, 0 }
9798
};
9899

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

105106
switch (c) {
106-
default:
107+
case GETOPT_VAL_HELP:
107108
if (cmd->usagestr)
108109
usage(cmd, 1);
110+
break;
111+
default:
112+
if (cmd->usagestr)
113+
usage_unknown_option(cmd, argv);
109114
}
110115
}
111116
}

0 commit comments

Comments
 (0)