chiark / gitweb /
tiocnotty: use with statement
[bin.git] / debman
diff --git a/debman b/debman
index 25a5f1ac44fcf091d0dcf531b2c14a0cc6075109..5217f3a31f5eac5b57be22386c9ae0bdf03ff8c3 100755 (executable)
--- a/debman
+++ b/debman
@@ -1,4 +1,4 @@
-#! /bin/sh -e
+#! /bin/bash -e
 
 # debman - read a man page from an uninstalled Debian package file (.deb)
 
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 # 02111-1307, USA.
 
-USAGE='Usage: debman <package.deb> [man options] <man page name> ...'
+usage () {
+    if [ "$1" -eq 1 ]; then
+        FD=2
+    else
+        FD=1
+    fi
+    cat >&$FD <<EOF
+Usage: debman [options] [-- man(1) options] <man page name> ...
 
-case "$1" in
-    -h|--help)
-        echo "$USAGE"
-        exit 0
-        ;;
-esac
+Options should be exactly one of:
+        -f package.deb          read pages from package.deb archive
+        -p package              download .deb for package and read pages
+                                from there
+EOF
+    exit "$1"
+}
 
-if test $# -lt 2; then
-    echo "$USAGE" >&2
-    exit 1
+ARGS=`getopt -l help,filename:,package: -o hf:p: -n debman -- "$@"`
+eval set -- "$ARGS"
+
+FILENAME=
+PACKAGE=
+
+while :; do
+    case "$1" in
+        -h|--help)
+            usage 0
+            ;;
+        -f|--filename)
+            FILENAME="$2"
+            shift 2
+            ;;
+        -p|--package)
+            PACKAGE="$2"
+            shift 2
+            ;;
+        --)
+            shift
+            break
+            ;;
+        *)
+            echo "debman: Internal error in option parsing" >&2
+            exit 1
+            ;;
+    esac
+done
+
+if ( [ -n "$FILENAME" ] && [ -n "$PACKAGE" ] ) || \
+   ( [ -z "$FILENAME" ] && [ -z "$PACKAGE" ] ); then
+    usage 1
+fi
+
+if test $# -lt 1; then
+    usage 1
 fi
-    
+
 # Directory names are duplicated with and without ./ in order to cope with
 # old .debs whose data.tar.gz components had a slightly different format.
 MANDIRS='usr/share/man usr/X11R6/man ./usr/share/man ./usr/X11R6/man'
@@ -40,13 +82,22 @@ MANDIRS='usr/share/man usr/X11R6/man ./usr/share/man ./usr/X11R6/man'
 TEMPDIR=`mktemp -dt debman.XXXXXXXXXX`
 trap 'rm -rf "$TEMPDIR"' EXIT ERR HUP INT QUIT TERM
 
+if [ -n "$PACKAGE" ]; then
+    (cd "$TEMPDIR" && debget "$PACKAGE")
+    # There should be at most one file in $TEMPDIR now.
+    FILENAME="`find \"$TEMPDIR\" -name \*.deb -print`"
+    if [ -z "$FILENAME" ]; then
+        echo "Failed to fetch package $PACKAGE; exiting." >&2
+        exit 1
+    fi
+fi
+
 # Ignore errors from tar (though not dpkg). They'll generally just be of the
 # form "tar: usr/share/man: Not found in archive". If they're something
 # else, then man will fail to find the page anyway.
 
-dpkg --fsys-tarfile "$1" | \
+dpkg --fsys-tarfile "$FILENAME" | \
     (tar -C "$TEMPDIR" -xf - $MANDIRS 2>/dev/null || true)
-shift
 
 MANPATH="$TEMPDIR/usr/share/man:$TEMPDIR/usr/X11R6/man" man "$@"