All of lore.kernel.org
 help / color / mirror / Atom feed
* master - commands: improve help/usage output
@ 2017-02-14 15:52 David Teigland
  0 siblings, 0 replies; only message in thread
From: David Teigland @ 2017-02-14 15:52 UTC (permalink / raw)
  To: lvm-devel

Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f46b28bdb6f8c0f7bae7a8b4fb4b886332831318
Commit:        f46b28bdb6f8c0f7bae7a8b4fb4b886332831318
Parent:        c868562a7968db9b0d00df9b1d0a8967a9aacaa3
Author:        David Teigland <teigland@redhat.com>
AuthorDate:    Tue Feb 14 09:49:26 2017 -0600
Committer:     David Teigland <teigland@redhat.com>
CommitterDate: Tue Feb 14 09:52:09 2017 -0600

commands: improve help/usage output

Replace --help --help with --long-help.
Some blank lines were needed.
Add 'lvm help all' to print help for all commands.
---
 tools/args.h           |    7 +++-
 tools/command-lines.in |    2 +-
 tools/command.c        |    5 ++-
 tools/lvmcmdline.c     |   95 ++++++++++++++++++++++++++++--------------------
 4 files changed, 64 insertions(+), 45 deletions(-)

diff --git a/tools/args.h b/tools/args.h
index b33df9a..f64b126 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -244,6 +244,9 @@ arg(locktype_ARG, '\0', "locktype", locktype_VAL, 0, 0,
 arg(logonly_ARG, '\0', "logonly", 0, 0, 0,
     "Suppress command report and display only log report.\n")
 
+arg(longhelp_ARG, '\0', "longhelp", 0, 0, 0,
+    "Display long help text.\n")
+
 arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0,
     "Sets the maximum recovery rate for a RAID LV.  The rate value\n"
     "is an amount of data per second for each device in the array.\n"
@@ -920,8 +923,8 @@ arg(force_ARG, 'f', "force", 0, ARG_COUNTABLE, 0,
 /* Not used. */
 arg(full_ARG, 'f', "full", 0, 0, 0, NULL)
 
-arg(help_ARG, 'h', "help", 0, ARG_COUNTABLE, 0,
-    "Display help text. Repeat this option for more information.\n")
+arg(help_ARG, 'h', "help", 0, 0, 0,
+    "Display help text.\n")
 
 arg(cache_ARG, 'H', "cache", 0, 0, 0,
     "Specifies the command is handling a cache LV or cache pool.\n"
diff --git a/tools/command-lines.in b/tools/command-lines.in
index 2eddd41..b6aa1d1 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -187,7 +187,7 @@
 # OO_ALL is included in every command automatically.
 #
 OO_ALL: --commandprofile String, --config String, --debug,
---driverloaded Bool, --help, --profile String, --quiet,
+--driverloaded Bool, --help, --longhelp, --profile String, --quiet,
 --verbose, --version, --yes, --test
 
 #
diff --git a/tools/command.c b/tools/command.c
index 0ff5cd7..a968bed 100644
--- a/tools/command.c
+++ b/tools/command.c
@@ -1640,7 +1640,7 @@ void print_usage(struct command *cmd)
 
 	printf(" ]");
  done:
-	printf("\n");
+	printf("\n\n");
 	return;
 }
 
@@ -1704,7 +1704,8 @@ void print_usage_common(struct command_name *cname, struct command *cmd)
 		}
 	}
 
-	printf(" ]\n");
+	printf(" ]");
+	printf("\n\n");
 }
 
 #ifdef MAN_PAGE_GENERATOR
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 43278ff..494f01f 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -1384,7 +1384,7 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
 			continue;
 
 		/* For help and version just return the first entry with matching name. */
-		if (arg_is_set(cmd, help_ARG) || arg_is_set(cmd, help2_ARG) || arg_is_set(cmd, version_ARG))
+		if (arg_is_set(cmd, help_ARG) || arg_is_set(cmd, help2_ARG) || arg_is_set(cmd, longhelp_ARG) || arg_is_set(cmd, version_ARG))
 			return &commands[i];
 
 		match_required = 0;    /* required parameters that match */
@@ -1661,7 +1661,40 @@ static void _short_usage(const char *name)
 	log_error("Run `%s --help' for more information.", name);
 }
 
-static int _usage(const char *name, int help_count)
+static void _usage_notes(void)
+{
+	/*
+	 * Excluding commonly understood syntax style like the meanings of:
+	 * [ ] for optional, ... for repeatable, | for one of the following,
+	 * -- for an option name, lower case strings and digits for literals.
+	 */
+	log_print("Usage notes:");
+	log_print(". Variable parameters are: Number, String, PV, VG, LV, Tag.");
+	log_print(". Select indicates that a required positional parameter can");
+	log_print("  be omitted if the --select option is used.");
+	log_print(". --size Number can be replaced with --extents NumberExtents.");
+	log_print(". When --name is omitted from lvcreate, a new LV name is");
+	log_print("  generated with the \"lvol\" prefix and a unique numeric suffix.");
+	log_print(". The required VG parameter in lvcreate may be omitted when");
+	log_print("  the VG name is included in another option, e.g. --name VG/LV.");
+	log_print(". For required options listed in parentheses, e.g. (--A, --B),");
+	log_print("  any one is required, after which the others are optional.");
+	log_print(". The _new suffix indicates the VG or LV must not yet exist.");
+	log_print(". LV followed by _<type> indicates that an LV of the given type");
+	log_print("  is required.  (raid represents any raid<N> type.)");
+	log_print(". Input units are always treated as base two values, regardless of");
+	log_print("  unit capitalization, e.g. 'k' and 'K' both refer to 1024.");
+	log_print(". The default input unit is specified by letter, followed by |unit");
+	log_print("  which represents other possible input units: bBsSkKmMgGtTpPeE.");
+	log_print(". Output units can be specified with the --units option, for which");
+	log_print("  lower/upper case letters refer to base 2/10 values.");
+	log_print("  formats that are recognized, e.g. for compatibility.");
+	log_print(". See man pages for short option equivalents of long option names,");
+	log_print("  and for more detailed descriptions of variable parameters.");
+	log_print(" ");
+}
+
+static int _usage(const char *name, int longhelp)
 {
 	struct command_name *cname = find_command_name(name);
 	struct command *cmd;
@@ -1678,52 +1711,33 @@ static int _usage(const char *name, int help_count)
 		if (strcmp(_cmdline.commands[i].name, name))
 			continue;
 
-		if ((_cmdline.commands[i].cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && (help_count < 3))
+		if ((_cmdline.commands[i].cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !longhelp)
 			continue;
 
 		print_usage(&_cmdline.commands[i]);
 		cmd = &_cmdline.commands[i];
-		printf("\n");
 	}
 
 	/* Common options are printed once for all variants of a command name. */
 	print_usage_common(cname, cmd);
 
-	if (help_count > 1) {
-		/*
-		 * Excluding commonly understood syntax style like the meanings of:
-		 * [ ] for optional, ... for repeatable, | for one of the following,
-		 * -- for an option name, lower case strings and digits for literals.
-		 */
-		log_print("Usage notes:");
-		log_print(". Variable parameters are: Number, String, PV, VG, LV, Tag.");
-		log_print(". Select indicates that a required positional parameter can");
-		log_print("  be omitted if the --select option is used.");
-		log_print(". --size Number can be replaced with --extents NumberExtents.");
-		log_print(". When --name is omitted from lvcreate, a new LV name is");
-		log_print("  generated with the \"lvol\" prefix and a unique numeric suffix.");
-		log_print(". The required VG parameter in lvcreate may be omitted when");
-		log_print("  the VG name is included in another option, e.g. --name VG/LV.");
-		log_print(". For required options listed in parentheses, e.g. (--A, --B),");
-		log_print("  any one is required, after which the others are optional.");
-		log_print(". The _new suffix indicates the VG or LV must not yet exist.");
-		log_print(". LV followed by _<type> indicates that an LV of the given type");
-		log_print("  is required.  (raid represents any raid<N> type.)");
-		log_print(". Input units are always treated as base two values, regardless of");
-		log_print("  unit capitalization, e.g. 'k' and 'K' both refer to 1024.");
-		log_print(". The default input unit is specified by letter, followed by |unit");
-		log_print("  which represents other possible input units: bBsSkKmMgGtTpPeE.");
-		log_print(". Output units can be specified with the --units option, for which");
-		log_print("  lower/upper case letters refer to base 2/10 values.");
-		log_print(". Use --help --help --help to print secondary command syntax");
-		log_print("  formats that are recognized, e.g. for compatibility.");
-		log_print(". See man pages for short option equivalents of long option names,");
-		log_print("  and for more detailed descriptions of variable parameters.");
-	}
+	if (longhelp)
+		_usage_notes();
 
 	return 1;
 }
 
+static void _usage_all(void)
+{
+	int i;
+
+	for (i = 0; i < MAX_COMMAND_NAMES; i++) {
+		if (!command_names[i].name)
+			break;
+		_usage(command_names[i].name, 0);
+	}
+}
+
 /*
  * Sets up the arguments to pass to getopt_long().
  *
@@ -2158,11 +2172,10 @@ static int _get_settings(struct cmd_context *cmd)
 
 static int _process_common_commands(struct cmd_context *cmd)
 {
-	if (arg_is_set(cmd, help_ARG) || arg_is_set(cmd, help2_ARG)) {
-		_usage(cmd->name, arg_count(cmd, help_ARG));
-
-		if (arg_count(cmd, help_ARG) < 2)
-			log_print("(Use --help --help for usage notes.)");
+	if (arg_is_set(cmd, help_ARG) ||
+	    arg_is_set(cmd, longhelp_ARG) ||
+	    arg_is_set(cmd, help2_ARG)) {
+		_usage(cmd->name, arg_is_set(cmd, longhelp_ARG));
 		return ECMD_PROCESSED;
 	}
 
@@ -2195,6 +2208,8 @@ int help(struct cmd_context *cmd __attribute__((unused)), int argc, char **argv)
 
 	if (!argc)
 		_display_help();
+	else if (argc == 1 && !strcmp(argv[0], "all"))
+		_usage_all();
 	else {
 		int i;
 		for (i = 0; i < argc; i++)



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2017-02-14 15:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-14 15:52 master - commands: improve help/usage output David Teigland

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.