util-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] tools: checkman.sh portability
@ 2015-01-13 18:46 JWP
  2015-01-13 18:55 ` [PATCH 1/4] " JWP
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: JWP @ 2015-01-13 18:46 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Sami Kerola

So, Sami Kerola's checkmans.sh tool caught me stuttering in
hwclock.8 and I had to find out why checkmans did not work
on my system:

 1) Any test file with 'git' or 'lib' in its path fails.
    Including my entire repo under $PATH/github/util-linux
    and the ./lib/terminal-colors.d.5 man-page.

 2) It depends on the man-db package.

The changes seem to be an improvement as it detected 4 new
man-page problems (see separate patch).

I did alter the behavior slightly, previously failed pages
required checking them again manually. Now it shows the troff
parsing errors in progress. When grog fails there is nothing
more to check, and when lexgrog fails I left the old behavior
telling the caller to rerun the command, because I did not
bother to install man-db to see what lexgrog actually does.


The following changes since commit 2e5bf10e32b00c92a3f7fb8b38d793ea6fc1dff2:

  build-sys: add sfdisk.static (2015-01-13 16:59:03 +0100)

are available in the git repository at:

  git@github.com:jwpi/util-linux.git checkman

J William Piggott (4):
  tools: checkman.sh portability
  tools: checkman.sh portability lexgrog
  tools: checkmans.sh clean up 'let'
  tools: checkmans.sh add stats

 tools/checkmans.sh | 85 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 52 insertions(+), 33 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] tools: checkman.sh portability
  2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
@ 2015-01-13 18:55 ` JWP
  2015-01-13 18:57 ` [PATCH 2/4] tools: checkman.sh portability lexgrog JWP
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: JWP @ 2015-01-13 18:55 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Sami Kerola

checkman.sh fails if 'git' or 'lib' are
anywhere in the tested file's path:
   Change to using relative paths.
   Improve the 'find' command call.

checkman.sh depends upon the man-db package:
   Remove all instants of the man command and
   use troff directly to improve portability.

Signed-off-by: J William Piggott <elseifthen@gmx.com>
---
 tools/checkmans.sh | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/tools/checkmans.sh b/tools/checkmans.sh
index bc3ba8f..6b80853 100755
--- a/tools/checkmans.sh
+++ b/tools/checkmans.sh
@@ -39,10 +39,6 @@ while getopts vVh OPTIONS; do
 	esac
 done
 
-ERROR_FILE=$(mktemp ${SCRIPT_INVOCATION_SHORT_NAME}.XXXXXXXXXX)
-# remove tmp file at exit
-trap "rm -f ${ERROR_FILE}" 0
-
 # Try to find missing manuals matching build targets with manual files.
 declare -A MAN_LIST BIN_LIST
 
@@ -68,9 +64,10 @@ remove_repeats()
 	set -u
 }
 
+cd $(git rev-parse --show-toplevel)
+
 for I in $(
-	find $(git rev-parse --show-toplevel) -name '*.[1-8]' |
-	egrep -v '(Documentation|.git|/.libs/|autom4te.cache)'
+	find -path './autom4te.cache' -prune -o -name '*[[:alpha:]].[1-8]' -print
 ); do
 	MAN_FILE=${I##*/}
 	MAN_LIST[${MAN_FILE%%.[0-9]}]=1
@@ -78,7 +75,7 @@ for I in $(
 		# Some manuals, such as x86_64, call inclusion and they
 		# should not be tested any further.
 		if ${VERBOSE}; then
-			printf "skipping: ${I##*util-linux/}: includes "
+			printf "skipping: ${I}: includes "
 			awk '{print $2}' ${I}
 		fi
 		continue
@@ -87,16 +84,17 @@ for I in $(
 	if ${VERBOSE}; then
 		echo "testing: ${I}"
 	fi
-	MANWIDTH=80 man --warnings=all ${I} >/dev/null 2>| ${ERROR_FILE}
-	if [ -s ${ERROR_FILE} ]; then
-		echo "error: run: man --warnings=all ${I##*util-linux/} >/dev/null" >&2
-		I_ERR=1
+	RET=1
+	cat ${I} | troff -mandoc -ww -z |& grep "<" && RET=$?
+	if [ $RET = 0 ]; then
+	echo "From: cat ${I} | troff -mandoc -ww -z"
+	echo "=================================================="
 	fi
 	if ! lexgrog ${I} >/dev/null; then
-		echo "error: run: lexgrog ${I##*util-linux/}" >&2
+		echo "error: run: lexgrog ${I}" >&2
 		I_ERR=1
 	fi
-	REPEATS=( $(MANWIDTH=2000 man -l ${I} |
+	REPEATS=( $(cat ${I} | troff -mandoc -ww -Tascii | grotty |
 		col -b |
 		sed  -e 's/\s\+/\n/g; /^$/d' |
 		awk 'BEGIN { p="" } { if (0 < length($0)) { if (p == $0) { print } } p = $0 }') )
@@ -109,7 +107,7 @@ for I in $(
 			let ITER=${ITER}-1 || true
 		done
 		if [ 0 -lt "${#REPEATS[@]}" ]; then
-			echo "warning: ${I##*util-linux/} has repeating words: ${REPEATS[@]}"
+			echo "warning: ${I} has repeating words: ${REPEATS[@]}"
 		fi
 	fi
 	# The 'let' may cause exit on error.

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] tools: checkman.sh portability lexgrog
  2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
  2015-01-13 18:55 ` [PATCH 1/4] " JWP
@ 2015-01-13 18:57 ` JWP
  2015-01-13 18:59 ` [PATCH 3/4] tools: checkmans.sh clean up 'let' JWP
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: JWP @ 2015-01-13 18:57 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Sami Kerola

checkman.sh depends upon the man-db package:
   Add using grog when lexgrog not installed.

   /dev/null some troff noise.

Signed-off-by: J William Piggott <elseifthen@gmx.com>
---
 tools/checkmans.sh | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/tools/checkmans.sh b/tools/checkmans.sh
index 6b80853..513a750 100755
--- a/tools/checkmans.sh
+++ b/tools/checkmans.sh
@@ -90,11 +90,23 @@ for I in $(
 	echo "From: cat ${I} | troff -mandoc -ww -z"
 	echo "=================================================="
 	fi
-	if ! lexgrog ${I} >/dev/null; then
-		echo "error: run: lexgrog ${I}" >&2
-		I_ERR=1
+	GROG=1
+	if command -v lexgrog &> /dev/null; then
+		if ! lexgrog ${I} >/dev/null; then
+			echo "error: run: lexgrog ${I}"
+			echo "=================================================="
+			((++COUNT_ERRORS))
+		fi
+	elif command -v grog &> /dev/null; then
+		if ! grog ${I} | grep man >/dev/null; then
+			echo "error: grog ${I} is not a man file"
+			echo "=================================================="
+			((++COUNT_ERRORS))
+		fi
+	else
+	GROG=0
 	fi
-	REPEATS=( $(cat ${I} | troff -mandoc -ww -Tascii | grotty |
+	REPEATS=( $(cat ${I} | troff -mandoc -Tascii 2>/dev/null | grotty |
 		col -b |
 		sed  -e 's/\s\+/\n/g; /^$/d' |
 		awk 'BEGIN { p="" } { if (0 < length($0)) { if (p == $0) { print } } p = $0 }') )
@@ -147,8 +159,12 @@ for I in ${!BIN_LIST[@]}; do
 done
 set -u
 
+if [ ${GROG} = 0 ]; then
+echo "warning: neither grog nor lexgrog commands were found"
+fi
+
 if [ ${COUNT_ERRORS} -ne 0 ]; then
-	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_ERRORS} manuals failed" >&2
+	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_ERRORS} manuals failed"
 	exit 1
 fi
 

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] tools: checkmans.sh clean up 'let'
  2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
  2015-01-13 18:55 ` [PATCH 1/4] " JWP
  2015-01-13 18:57 ` [PATCH 2/4] tools: checkman.sh portability lexgrog JWP
@ 2015-01-13 18:59 ` JWP
  2015-01-13 19:02 ` [PATCH 4/4] tools: checkmans.sh add stats JWP
  2015-01-14  9:26 ` [PATCH 0/4] tools: checkman.sh portability Karel Zak
  4 siblings, 0 replies; 6+ messages in thread
From: JWP @ 2015-01-13 18:59 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Sami Kerola

Clean up 'let' issues and loop iteration.

Signed-off-by: J William Piggott <elseifthen@gmx.com>
---
 tools/checkmans.sh | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/tools/checkmans.sh b/tools/checkmans.sh
index 513a750..bd2bc43 100755
--- a/tools/checkmans.sh
+++ b/tools/checkmans.sh
@@ -42,7 +42,8 @@ done
 # Try to find missing manuals matching build targets with manual files.
 declare -A MAN_LIST BIN_LIST
 
-COUNT_ERRORS=0
+declare -i ITER
+declare -i COUNT_ERRORS=0
 declare -a REPEATS
 declare -A KNOWN_REPEATS
 KNOWN_REPEATS[mount.8]='foo'
@@ -111,21 +112,14 @@ for I in $(
 		sed  -e 's/\s\+/\n/g; /^$/d' |
 		awk 'BEGIN { p="" } { if (0 < length($0)) { if (p == $0) { print } } p = $0 }') )
 	if [ 0 -lt "${#REPEATS[@]}" ]; then
-		ITER=${#REPEATS[@]}
-		while [ -1 -lt ${ITER} ]; do
+		ITER=${#REPEATS[@]}+1
+		while ((ITER--)); do
 			remove_repeats ${ITER}
-			# The 'let' may cause exit on error.
-			# When ITER == 0 -> let returns 1, bash bug?
-			let ITER=${ITER}-1 || true
 		done
 		if [ 0 -lt "${#REPEATS[@]}" ]; then
 			echo "warning: ${I} has repeating words: ${REPEATS[@]}"
 		fi
 	fi
-	# The 'let' may cause exit on error.
-	# COUNT_ERRORS=0; let COUNT_ERRORS=$COUNT_ERRORS+0; echo $?
-	# Is this a bash bug?
-	let COUNT_ERRORS=$COUNT_ERRORS+$I_ERR || true
 done
 
 # Create a list of build targets.

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] tools: checkmans.sh add stats
  2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
                   ` (2 preceding siblings ...)
  2015-01-13 18:59 ` [PATCH 3/4] tools: checkmans.sh clean up 'let' JWP
@ 2015-01-13 19:02 ` JWP
  2015-01-14  9:26 ` [PATCH 0/4] tools: checkman.sh portability Karel Zak
  4 siblings, 0 replies; 6+ messages in thread
From: JWP @ 2015-01-13 19:02 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux, Sami Kerola

Add test results statistics.
Fix-up 'KNOWN_REPEATS'.
Version bump.

Signed-off-by: J William Piggott <elseifthen@gmx.com>
---
 tools/checkmans.sh | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/tools/checkmans.sh b/tools/checkmans.sh
index bd2bc43..618f8ba 100755
--- a/tools/checkmans.sh
+++ b/tools/checkmans.sh
@@ -26,7 +26,7 @@ while getopts vVh OPTIONS; do
 			VERBOSE='true'
 			;;
 		V)
-			echo "util-linux: ${SCRIPT_INVOCATION_SHORT_NAME}: 2"
+			echo "util-linux: ${SCRIPT_INVOCATION_SHORT_NAME}: v2.1"
 			exit 0
 			;;
 		h)
@@ -43,11 +43,13 @@ done
 declare -A MAN_LIST BIN_LIST
 
 declare -i ITER
-declare -i COUNT_ERRORS=0
+declare -i COUNT_GROG=0
+declare -i COUNT_TROFF=0
+declare -i COUNT_REPEATS=0
 declare -a REPEATS
 declare -A KNOWN_REPEATS
-KNOWN_REPEATS[mount.8]='foo'
-KNOWN_REPEATS[sfdisk.8]="0 <c,h,s>"
+KNOWN_REPEATS[mount.8]='foo l2 l c'
+KNOWN_REPEATS[hexdump.1]='l'
 KNOWN_REPEATS[flock.1]='"$0"'
 KNOWN_REPEATS[switch_root.8]='$DIR'
 
@@ -81,7 +83,6 @@ for I in $(
 		fi
 		continue
 	fi
-	I_ERR=0
 	if ${VERBOSE}; then
 		echo "testing: ${I}"
 	fi
@@ -90,22 +91,23 @@ for I in $(
 	if [ $RET = 0 ]; then
 	echo "From: cat ${I} | troff -mandoc -ww -z"
 	echo "=================================================="
+	((++COUNT_TROFF))
 	fi
 	GROG=1
 	if command -v lexgrog &> /dev/null; then
 		if ! lexgrog ${I} >/dev/null; then
 			echo "error: run: lexgrog ${I}"
 			echo "=================================================="
-			((++COUNT_ERRORS))
+			((++COUNT_GROG))
 		fi
 	elif command -v grog &> /dev/null; then
 		if ! grog ${I} | grep man >/dev/null; then
 			echo "error: grog ${I} is not a man file"
 			echo "=================================================="
-			((++COUNT_ERRORS))
+			((++COUNT_GROG))
 		fi
 	else
-	GROG=0
+		GROG=0
 	fi
 	REPEATS=( $(cat ${I} | troff -mandoc -Tascii 2>/dev/null | grotty |
 		col -b |
@@ -118,6 +120,8 @@ for I in $(
 		done
 		if [ 0 -lt "${#REPEATS[@]}" ]; then
 			echo "warning: ${I} has repeating words: ${REPEATS[@]}"
+			echo "=================================================="
+			((++COUNT_REPEATS))
 		fi
 	fi
 done
@@ -148,17 +152,24 @@ done
 set +u
 for I in ${!BIN_LIST[@]}; do
 	if [ -v ${MAN_LIST[$I]} ]; then
-		echo "warning: ${I} does not have man page"
+		echo "warning: ${SCRIPT_INVOCATION_SHORT_NAME}: ${I} does not have man page"
 	fi
 done
 set -u
 
+echo "${SCRIPT_INVOCATION_SHORT_NAME}: ${#BIN_LIST[*]} build targets were found"
+echo "${SCRIPT_INVOCATION_SHORT_NAME}: ${#MAN_LIST[*]} files were tested"
+
 if [ ${GROG} = 0 ]; then
 echo "warning: neither grog nor lexgrog commands were found"
 fi
 
-if [ ${COUNT_ERRORS} -ne 0 ]; then
-	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_ERRORS} manuals failed"
+if [ ${COUNT_GROG} -ne 0 -o ${COUNT_TROFF} -ne 0 -o ${COUNT_REPEATS} -ne 0 ]; then
+	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_GROG} files failed (lex)grog man-page test"
+	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_TROFF} files failed troff parsing test"
+	echo "error: ${SCRIPT_INVOCATION_SHORT_NAME}: ${COUNT_REPEATS} files have repeating words"
+	ITER=${#MAN_LIST[*]}-${COUNT_GROG}-${COUNT_TROFF}-${COUNT_REPEATS}
+	echo "${SCRIPT_INVOCATION_SHORT_NAME}: ${ITER} man-pages approved"
 	exit 1
 fi
 

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/4] tools: checkman.sh portability
  2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
                   ` (3 preceding siblings ...)
  2015-01-13 19:02 ` [PATCH 4/4] tools: checkmans.sh add stats JWP
@ 2015-01-14  9:26 ` Karel Zak
  4 siblings, 0 replies; 6+ messages in thread
From: Karel Zak @ 2015-01-14  9:26 UTC (permalink / raw)
  To: JWP; +Cc: util-linux, Sami Kerola

On Tue, Jan 13, 2015 at 01:46:58PM -0500, JWP wrote:
> J William Piggott (4):
>   tools: checkman.sh portability
>   tools: checkman.sh portability lexgrog
>   tools: checkmans.sh clean up 'let'
>   tools: checkmans.sh add stats

 Merged, thanks.
> 

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-01-14  9:26 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-13 18:46 [PATCH 0/4] tools: checkman.sh portability JWP
2015-01-13 18:55 ` [PATCH 1/4] " JWP
2015-01-13 18:57 ` [PATCH 2/4] tools: checkman.sh portability lexgrog JWP
2015-01-13 18:59 ` [PATCH 3/4] tools: checkmans.sh clean up 'let' JWP
2015-01-13 19:02 ` [PATCH 4/4] tools: checkmans.sh add stats JWP
2015-01-14  9:26 ` [PATCH 0/4] tools: checkman.sh portability Karel Zak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).