In order to ease the job of keeping the documentations up to date, there is
a new script 'check-cmdline-options' that checks a program's options (with
the '--help' option) and compare them with its documentation (the manual
page) to make sure everything is aligned.

This is triggered with "make check" for wmaker.

Signed-off-by: Christophe CURIS <christophe.cu...@free.fr>
---
 Makefile.am                         |   1 +
 doc/Makefile.am                     |  13 +++
 script/check-cmdline-options-doc.sh | 156 ++++++++++++++++++++++++++++++++++++
 3 files changed, 170 insertions(+)
 create mode 100755 script/check-cmdline-options-doc.sh

diff --git a/Makefile.am b/Makefile.am
index 2357d24..071d13f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -38,6 +38,7 @@ EXTRA_DIST = TODO BUGS BUGFORM FAQ INSTALL \
        The-perfect-Window-Maker-patch.txt \
        README COPYING.WTFPL autogen.sh \
        email-clients.txt checkpatch.pl update-changelog.pl \
+       script/check-cmdline-options-doc.sh \
        script/check-translation-sources.sh \
        script/generate-mapfile-from-header.sh \
        script/generate-po-from-template.sh \
diff --git a/doc/Makefile.am b/doc/Makefile.am
index f39079c..db69f90 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -25,3 +25,16 @@ man_MANS = \
 
 EXTRA_DIST = $(man_MANS)
 
+# Create a 'silent rule' for our make check the same way automake does
+AM_V_CHKOPTS = $(am__v_CHKOPTS_$(V))
+am__v_CHKOPTS_  = $(am__v_CHKOPTS_$(AM_DEFAULT_VERBOSITY))
+am__v_CHKOPTS_0 = @echo "  CHK      $@" ;
+am__v_CHKOPTS_1 =
+
+check-local: wmaker-args
+
+wmaker-args:
+       $(AM_V_CHKOPTS)$(top_srcdir)/script/check-cmdline-options-doc.sh \
+               --program "$(top_builddir)/src/wmaker" --man-page 
"$(top_srcdir)/doc/wmaker.1x"
+
+.PHONY: wmaker-args
diff --git a/script/check-cmdline-options-doc.sh 
b/script/check-cmdline-options-doc.sh
new file mode 100755
index 0000000..d2aa173
--- /dev/null
+++ b/script/check-cmdline-options-doc.sh
@@ -0,0 +1,156 @@
+#!/bin/sh
+###########################################################################
+#
+#  Window Maker window manager
+#
+#  Copyright (c) 2015 Christophe CURIS
+#  Copyright (c) 2015 Window Maker Team
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License along
+#  with this program; if not, write to the Free Software Foundation, Inc.,
+#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+###########################################################################
+#
+# check-cmdline-options-doc.sh:
+#   Compare the options listed in a program's --help text against its
+#   documentation, check that all options are described and that there are
+#   not deprecated options in the doc.
+#
+# A know limitation is that it assumes the help text from the program is
+# in line with what the program actually supports, because it would be too
+# complicated to actually check also in the sources the supported options.
+#
+###########################################################################
+#
+# For portability, we stick to the same sh+sed constraint as Autotools to
+# limit problems, see for example:
+#   
http://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Portable-Shell.html
+#
+###########################################################################
+
+# Report an error on stderr and exit with status 2 to tell make that we could
+# not do what we were asked
+arg_error() {
+    echo "`basename $0`: $@" >&2
+    exit 2
+}
+
+# print help and exit with success status
+print_help() {
+    echo "$0: check program's list of options against its documentation"
+    echo "Usage: $0 options..."
+    echo "valid options are:"
+    echo "  --man-page file   : program's documentation file, in man format"
+    echo "  --program name    : name of the program to run with '--help'"
+    exit 0
+}
+
+# Extract command line arguments
+while [ $# -gt 0 ]; do
+    case $1 in
+       --man-page)
+            shift
+            [ -z "$man_page" ] || arg_error "only 1 documentation file can be 
used (option: --man-page)"
+            man_page="$1"
+         ;;
+
+       --program)
+            shift
+            [ -z "$prog_name" ] || arg_error "only 1 program can be used 
(option: --program)"
+            prog_name="$1"
+          ;;
+
+        -h|-help|--help) print_help ;;
+        -*) arg_error "unknow option '$1'" ;;
+
+        *)
+            arg_error "argument '$1' is not understood"
+          ;;
+    esac
+    shift
+done
+
+# Check consistency of command-line
+[ -z "$prog_name" ] && arg_error "no program given (option: --program)"
+[ -z "$man_page" ] && arg_error "no documentation given"
+
+[ -z "$man_page" ] || [ -r "$man_page" ] || arg_error "man page file 
'$man_page' is not readable (option: --man-page)"
+
+# Make sure the program will not be searched in $PATH
+if ! echo "$prog_name" | grep '/' > /dev/null ; then
+    prog_name="./$prog_name"
+fi
+
+[ -x "$prog_name" ] || arg_error "program '$prog_name' does not exist or is 
not executable"
+
+# Get the list of options that the program claims it supports
+# -----------------------------------------------------------
+# We suppose (it is common practice) that the options are listed one per line
+# with no other text at the beginning of the line
+# If the line contains both a short option followed by a long option, we keep 
only the long
+# option because it is better to check for it
+prog_options=`$prog_name --help | sed -n '/^[ \t]*-/ { s/^[ \t]*// ; 
s/^-[^-],[ \t]*--/--/ ; s/[^-A-Z_a-z0-9].*$// ; p }' `
+
+[ "x$prog_options" = "x" ] && arg_error "program '$prog_name --help' did not 
return any option"
+
+
+if [ -n "$man_page" ]; then
+  # In the man page format, the options must be grouped in the section 
"OPTIONS"
+  # The name of the option is on the first line after the '.TP' command
+  # The format requires the use of a backslash before the dash ('\-')
+  sed_script='/^\.SH[ \t]*"*OPTIONS"*/,/^\.SH/ {
+                 /^\.TP/ {
+                    n
+                    s/^\.[A-Z]*//
+                    s/^[ \t]*//
+                    s/^\([^ \t]*\)[ \t].*$/\1/
+                    s/\\-/-/g
+                    p
+                 }
+              }'
+  doc_options=`sed -n "$sed_script" "$man_page" `
+fi
+
+# If no problem is found, we will exit with status OK
+exit_status=0
+
+# Check that all program options are documented
+for opt in $prog_options
+do
+  if ! echo "$doc_options" | grep "^$opt\$" > /dev/null ; then
+    echo "Error: program option '$opt' is not in the documentation '$man_page'"
+    exit_status=1
+  fi
+done
+
+# Check that all documentation options are listed by the program
+for opt in $doc_options
+do
+  if ! echo "$prog_options" | grep "^$opt\$" > /dev/null ; then
+    echo "Error: option '$opt' is documented, but not in '$prog_name --help'"
+    exit_status=1
+  fi
+done
+
+# It is recommended to list options in alphabetical order because it is then
+# easier to search for one
+if [ -n "$man_page" ]; then
+  if ! echo "$doc_options" | sed -e 's/^-*//' | sort -c ; then
+    echo "Error: options are not sorted alphabetically in '$man_page'"
+    exit_status=1
+  fi
+fi
+
+# exit with appropriate return code, wether discrepancies were found or not
+exit $exit_status
-- 
2.1.4


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to