diff options
Diffstat (limited to 'scripts/manpage-alert.sh')
-rwxr-xr-x | scripts/manpage-alert.sh | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/scripts/manpage-alert.sh b/scripts/manpage-alert.sh new file mode 100755 index 0000000..626b377 --- /dev/null +++ b/scripts/manpage-alert.sh @@ -0,0 +1,147 @@ +#!/bin/sh -e +# +# Copyright 2005 Branden Robinson +# Changes copyright 2007 by their respective authors +# +# 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. + +usage() { + cat <<EOF +Usage: manpage-alert [options] [paths] + Options: + -h, --help This usage screen. + -V, --version Display the version and copyright information. + -f, --file Show filenames of missing manpages + without any leading text. + -p, --package Show filenames of missing manpages + with their package name. + -n, --no-stat Do not show statistics at the end. + + This script will locate executables in the given paths with manpage + outputs for which no manpage is available and its statistics. + + If no paths are specified on the command line, "/bin /sbin /usr/bin + /usr/sbin /usr/games" will be used by default. +EOF +} + +version() { + cat <<EOF +This is manpage-alert, from the Debian devscripts package, version ###VERSION###. +This code is (C) 2005 by Branden Robinson, all rights reserved. +This program comes with ABSOLUTELY NO WARRANTY. +You are free to redistribute this code under the terms of the +GNU General Public License, version 2 or later. +EOF +} + +showpackage() { + F1="$1" + P1="$(LANG=C dpkg-query -S "$F1" 2> /dev/null || true )" + Q1=""; R1=""; Q2=""; R2="" + if [ -n "$P1" ]; then + Q1="$(echo "$P1" | grep -v "^diversion by" || true)" + R1="$(echo "$P1" | sed -ne 's/^diversion by \(.*\) to:.*$/\1/p'): $F1" + fi + # symlink may be created by postinst script for alternatives etc., + if [ -z "$Q1" ] && [ -L "$F1" ]; then + F2=$(readlink -f "$F1") + P2="$(LANG=C dpkg-query -S "$F2" 2> /dev/null || true )" + if [ -n "$P2" ]; then + Q2="$(echo "$P2" | grep -v "^diversion by" || true)" + R2="$(echo "$P2" | sed -ne 's/^diversion by \(.*\) to:.*$/\1/p'): $F2" + fi + fi + if [ -n "$Q1" ]; then + echo "$Q1" + elif [ -n "$R1" ]; then + echo "$R1 (diversion)" + elif [ -n "$Q2" ]; then + echo "unknown_package: $F1 -> $Q2" + elif [ -n "$R2" ]; then + echo "unknown_package: $F1 -> $R2 (diversion)" + else + echo "unknown_package: $F1" + fi +} + +SHOWPACKAGE=DEFAULT +SHOWSTAT=TRUE + +while [ -n "$1" ]; do + case "$1" in + -h|--help) usage; exit 0;; + -V|--version) version; exit 0;; + -p|--package) SHOWPACKAGE=PACKAGE + shift + ;; + -f|--file) SHOWPACKAGE=FILE + shift + ;; + -n|--no-stat) SHOWSTAT=FALSE + shift + ;; + *) break + ;; + esac +done + +if [ $# -lt 1 ]; then + # check if we're running on a usrmerge system + if [ -L /bin -a -L /sbin ]; then + set -- /usr/bin /usr/sbin /usr/games + else + set -- /bin /sbin /usr/bin /usr/sbin /usr/games + fi +fi + +NUM_EXECUTABLES=0 +NUM_MANPAGES_FOUND=0 +NUM_MANPAGES_MISSING=0 + +for DIR in "$@"; do + for F in "$DIR"/*; do + # Skip as it's a symlink to /usr/bin + if [ "$F" = "/usr/bin/X11" ]; then continue; fi + NUM_EXECUTABLES=$(( NUM_EXECUTABLES + 1 )) + + if OUT=$(man -w -S 1:8:6 "${F##*/}" 2>&1 > /dev/null); then + NUM_MANPAGES_FOUND=$(( NUM_MANPAGES_FOUND + 1 )) + else + if [ $SHOWPACKAGE = "PACKAGE" ]; then + # echo "<packagename>: <filename>" + showpackage "$F" + elif [ $SHOWPACKAGE = "FILE" ]; then + # echo "<filename>" + echo "$F" + else + # echo "No manual entry for <filename>" + echo "$OUT" | perl -ne "next if /^.*'man 7 undocumented'.*$/;" \ + -e "s,(\W)\Q${F##*/}\E(?:\b|$),\1$F,; s,//,/,; print;" + fi + NUM_MANPAGES_MISSING=$(( NUM_MANPAGES_MISSING + 1 )) + fi + done +done + +if [ $SHOWSTAT = "TRUE" ]; then +echo +printf "Of %d commands, found manpages for %d (%d missing).\n" \ + $NUM_EXECUTABLES \ + $NUM_MANPAGES_FOUND \ + $NUM_MANPAGES_MISSING +fi + +# vim:set ai et sw=4 ts=4 tw=80: |