[Libguestfs] [PATCH] podcheck: Check tool --help output.

Richard W.M. Jones rjones at redhat.com
Wed Jul 20 12:00:49 UTC 2016


For OCaml tools this does essentially nothing useful because the
--help output is automatically generated from the options, and so
cannot be wrong.  However for C tools this is a useful check.

It would be nice to generate C tools --help output, but there isn't
enough information in the getopt data to do that.

This commit also includes fixes to the --help output for a few tools.
---
 align/scan.c      |  1 +
 df/main.c         |  4 ++--
 edit/edit.c       | 26 +++++++++++++-------------
 fish/fish.c       |  1 +
 make-fs/make-fs.c | 20 ++++++++++----------
 p2v/main.c        |  2 +-
 podcheck.pl       | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
 7 files changed, 74 insertions(+), 27 deletions(-)

diff --git a/align/scan.c b/align/scan.c
index 5f1d98a..e7327ea 100644
--- a/align/scan.c
+++ b/align/scan.c
@@ -87,6 +87,7 @@ usage (int status)
               "  --help               Display brief help\n"
               "  -P nr_threads        Use at most nr_threads\n"
               "  -q|--quiet           No output, just exit code\n"
+              "  --uuid               Print UUIDs instead of names\n"
               "  -v|--verbose         Verbose messages\n"
               "  -V|--version         Display version and exit\n"
               "  -x                   Trace libguestfs API calls\n"
diff --git a/df/main.c b/df/main.c
index e04b14e..23cdaee 100644
--- a/df/main.c
+++ b/df/main.c
@@ -78,12 +78,12 @@ usage (int status)
               "  --csv                Output as Comma-Separated Values\n"
               "  -d|--domain guest    Add disks from libvirt guest\n"
               "  --format[=raw|..]    Force disk format for -a option\n"
-              "  -h|--human-readable  Human-readable sizes in --long output\n"
+              "  -h|--human-readable  Print sizes in human-readable format\n"
               "  --help               Display brief help\n"
               "  -i|--inodes          Display inodes\n"
               "  --one-per-guest      Separate appliance per guest\n"
               "  -P nr_threads        Use at most nr_threads\n"
-              "  --uuid               Add UUIDs to --long output\n"
+              "  --uuid               Print UUIDs instead of names\n"
               "  -v|--verbose         Verbose messages\n"
               "  -V|--version         Display version and exit\n"
               "  -x                   Trace libguestfs API calls\n"
diff --git a/edit/edit.c b/edit/edit.c
index 2d3ccc6..eb9dfbd 100644
--- a/edit/edit.c
+++ b/edit/edit.c
@@ -70,20 +70,20 @@ usage (int status)
               "  %s [--options] -d domname file [file ...]\n"
               "  %s [--options] -a disk.img [-a disk.img ...] file [file ...]\n"
               "Options:\n"
-              "  -a|--add image       Add image\n"
-              "  -b|--backup .ext     Backup original as original.ext\n"
-              "  -c|--connect uri     Specify libvirt URI for -d option\n"
-              "  -d|--domain guest    Add disks from libvirt guest\n"
-              "  --echo-keys          Don't turn off echo for passphrases\n"
-              "  -e|--expr expr       Non-interactive editing using Perl expr\n"
-              "  --format[=raw|..]    Force disk format for -a option\n"
-              "  --help               Display brief help\n"
-              "  --keys-from-stdin    Read passphrases from stdin\n"
+              "  -a|--add image        Add image\n"
+              "  -b|--backup .ext      Backup original as original.ext\n"
+              "  -c|--connect uri      Specify libvirt URI for -d option\n"
+              "  -d|--domain guest     Add disks from libvirt guest\n"
+              "  --echo-keys           Don't turn off echo for passphrases\n"
+              "  -e|--edit|--expr expr Non-interactive editing using Perl expr\n"
+              "  --format[=raw|..]     Force disk format for -a option\n"
+              "  --help                Display brief help\n"
+              "  --keys-from-stdin     Read passphrases from stdin\n"
               "  -m|--mount dev[:mnt[:opts[:fstype]]]\n"
-              "                       Mount dev on mnt (if omitted, /)\n"
-              "  -v|--verbose         Verbose messages\n"
-              "  -V|--version         Display version and exit\n"
-              "  -x                   Trace libguestfs API calls\n"
+              "                        Mount dev on mnt (if omitted, /)\n"
+              "  -v|--verbose          Verbose messages\n"
+              "  -V|--version          Display version and exit\n"
+              "  -x                    Trace libguestfs API calls\n"
               "For more information, see the manpage %s(1).\n"),
             guestfs_int_program_name, guestfs_int_program_name,
             guestfs_int_program_name, guestfs_int_program_name);
diff --git a/fish/fish.c b/fish/fish.c
index e639d3d..d2cf359 100644
--- a/fish/fish.c
+++ b/fish/fish.c
@@ -126,6 +126,7 @@ usage (int status)
               "  --echo-keys          Don't turn off echo for passphrases\n"
               "  -f|--file file       Read commands from file\n"
               "  --format[=raw|..]    Force disk format for -a option\n"
+              "  --help               Display brief help\n"
               "  -i|--inspector       Automatically mount filesystems\n"
               "  --keys-from-stdin    Read passphrases from stdin\n"
               "  --listen             Listen for remote commands\n"
diff --git a/make-fs/make-fs.c b/make-fs/make-fs.c
index 42e7e82..8ece991 100644
--- a/make-fs/make-fs.c
+++ b/make-fs/make-fs.c
@@ -82,16 +82,16 @@ usage (int status)
               "  %s [--options] input.tar.gz output.img\n"
               "  %s [--options] directory output.img\n"
               "Options:\n"
-              "  --floppy               Make a virtual floppy disk\n"
-              "  --format=raw|qcow2|..  Set output format\n"
-              "  --help                 Display brief help\n"
-              "  --label=label          Filesystem label\n"
-              "  --partition=mbr|gpt|.. Set partition type\n"
-              "  --size=size|+size      Set size of output disk\n"
-              "  --type=ext4|..         Set filesystem type\n"
-              "  -v|--verbose           Verbose messages\n"
-              "  -V|--version           Display version and exit\n"
-              "  -x                     Trace libguestfs API calls\n"
+              "  --floppy                 Make a virtual floppy disk\n"
+              "  -F|--format=raw|qcow2|.. Set output format\n"
+              "  --help                   Display brief help\n"
+              "  --label=label            Filesystem label\n"
+              "  --partition=mbr|gpt|..   Set partition type\n"
+              "  -s|--size=size|+size     Set size of output disk\n"
+              "  -t|--type=ext4|..        Set filesystem type\n"
+              "  -v|--verbose             Verbose messages\n"
+              "  -V|--version             Display version and exit\n"
+              "  -x                       Trace libguestfs API calls\n"
               "For more information, see the manpage %s(1).\n"),
             guestfs_int_program_name, guestfs_int_program_name,
             guestfs_int_program_name, guestfs_int_program_name,
diff --git a/p2v/main.c b/p2v/main.c
index 6d6f555..35f0b59 100644
--- a/p2v/main.c
+++ b/p2v/main.c
@@ -86,7 +86,7 @@ usage (int status)
               "Options:\n"
               "  --help                 Display brief help\n"
               " --cmdline=CMDLINE       Used to debug command line parsing\n"
-              " --colours               Use ANSI colour sequences even if not tty\n"
+              " --colors|--colours      Use ANSI colour sequences even if not tty\n"
               " --iso                   Running in the ISO environment\n"
               " --test-disk=DISK.IMG    For testing, use disk as /dev/sda\n"
               "  -v|--verbose           Verbose messages\n"
diff --git a/podcheck.pl b/podcheck.pl
index fca91fb..527a2e4 100755
--- a/podcheck.pl
+++ b/podcheck.pl
@@ -153,6 +153,17 @@ delete $tool_option_exists{"--color"};
 delete $tool_option_exists{"--colour"};
 delete $tool_option_exists{"--debug-gc"};
 
+# Run the tool with --help.
+my $help_content;
+open PIPE, "LANG=C $tool --help |"
+    or die "$progname: $tool --help: $!";
+{
+    local $/ = undef;
+    $help_content = <PIPE>;
+}
+close PIPE;
+
+# Do the tests.
 my $errors = 0;
 
 # Check each option exists in the manual.
@@ -184,9 +195,43 @@ foreach (sort keys %pod_options) {
     }
 }
 
+# Check the tool's --help output mentions all the options.  (For OCaml
+# tools this is a waste of time since the --help output is generated,
+# but for C tools it is a genuine test).
+my $help_options_checked = 0;
+
+my %help_options = ();
+$help_options{$_} = 1 foreach ( $help_content =~ /(?<!\w)(-[-\w]+)/g );
+
+# There are some help options which we automatically ignore.
+delete $help_options{"--color"};
+delete $help_options{"--colour"};
+# "[--options]" is used as a placeholder for options in the synopsis
+# text, so ignore it.
+delete $help_options{"--options"};
+
+foreach (sort keys %tool_option_exists) {
+    unless ($ignore{$_}) {
+        unless (exists $help_options{$_}) {
+            $errors++;
+            warn "$progname: $tool: option $_ does not appear in --help output\n"
+        }
+    }
+}
+
+foreach (sort keys %help_options) {
+    unless ($ignore{$_}) {
+        $help_options_checked++;
+        unless (exists $tool_option_exists{$_}) {
+            $errors++;
+            warn "$progname: $tool: unknown option $_ appears in --help output\n"
+        }
+    }
+}
+
 exit 1 if $errors > 0;
 
-printf "$progname: $tool: checked $tool_options_checked tool options against $pod_options_checked documented options\n";
+printf "$progname: $tool: checked $tool_options_checked tool options, $pod_options_checked documented options, $help_options_checked help options\n";
 
 exit 0;
 
-- 
2.7.4




More information about the Libguestfs mailing list