summaryrefslogtreecommitdiffstats
path: root/generate-manpages/sqfscat-manpage.sh
diff options
context:
space:
mode:
Diffstat (limited to 'generate-manpages/sqfscat-manpage.sh')
-rwxr-xr-xgenerate-manpages/sqfscat-manpage.sh189
1 files changed, 189 insertions, 0 deletions
diff --git a/generate-manpages/sqfscat-manpage.sh b/generate-manpages/sqfscat-manpage.sh
new file mode 100755
index 0000000..305c2a9
--- /dev/null
+++ b/generate-manpages/sqfscat-manpage.sh
@@ -0,0 +1,189 @@
+#!/bin/sh
+
+# This script generates a manpage from the sqfscat -help and -version
+# output, using help2man. The script does various modfications to the
+# output from -help and -version, before passing it to help2man, to allow
+# it be successfully processed into a manpage by help2man.
+
+if [ ! -f functions.sh ]; then
+ echo "$0: this script should be run in the <git-root/source-root>/generate-manpages directory" >&2
+ exit 1
+fi
+
+. ./functions.sh
+
+if [ $# -lt 2 ]; then
+ error "$0: Insufficient arguments"
+ error "$0: <path to sqfscat> <output file>"
+ exit 1
+fi
+
+# Sanity check, ensure $1 points to a directory with a runnable Sqfscat
+if [ ! -x $1/sqfscat ]; then
+ error "$0: <arg1> doesn't point to a directory with Sqfscat in it!"
+ error "$0: <arg1> should point to the directory with the Sqfscat" \
+ "you want to generate a manpage for."
+ exit 1
+fi
+
+# Sanity check, check that the utilities this script depends on, are in PATH
+for i in sed help2man; do
+ if ! which $i > /dev/null 2>&1; then
+ error "$0: This script needs $i, which is not in your PATH."
+ error "$0: Fix PATH or install before running this script!"
+ exit 1
+ fi
+done
+
+tmp=$(mktemp -d)
+
+# Run sqfscat -help, and output the help text to
+# $tmp/sqfscat.help. This is to allow it to be modified before
+# passing to help2man.
+
+if ! $1/sqfscat -help > $tmp/sqfscat.help; then
+ error "$0: Running Sqfscat failed. Cross-compiled or incompatible binary?"
+ exit 1
+fi
+
+# Run sqfscat -version, and output the version text to
+# $tmp/sqfscat.version. This is to allow it to be modified before
+# passing to help2man.
+
+$1/sqfscat -version > $tmp/sqfscat.version
+
+# Create a dummy executable in $tmp, which outputs $tmp/sqfscat.help
+# and $tmp/sqfscat.version. This gets around the fact help2man wants
+# to pass --help and --version directly to sqfscat, rather than take the
+# (modified) output from $tmp/sqfscat.help and $tmp/sqfscat.version
+
+print "#!/bin/sh
+if [ \$1 = \"--help\" ]; then
+ cat $tmp/sqfscat.help
+else
+ cat $tmp/sqfscat.version
+fi" > $tmp/sqfscat.sh
+
+chmod u+x $tmp/sqfscat.sh
+
+# help2man gets confused by the version date returned by -version,
+# and includes it in the version string
+
+sed -i "s/ (.*)$//" $tmp/sqfscat.version
+
+# help2man expects copyright to have an upper-case C ...
+
+sed -i "s/^copyright/Copyright/" $tmp/sqfscat.version
+
+# help2man doesn't pick up the author from the version. Easiest to add
+# it here.
+
+print >> $tmp/sqfscat.version
+print "Written by Phillip Lougher <phillip@squashfs.org.uk>" >> $tmp/sqfscat.version
+
+# help2man expects "Usage: ", and so rename "SYNTAX:" to "Usage: "
+
+sed -i "s/^SYNTAX:/Usage: /" $tmp/sqfscat.help
+
+# Man pages expect the options to be in the "Options" section. So insert
+# Options section after Usage
+
+sed -i "/^Usage/a *OPTIONS*" $tmp/sqfscat.help
+
+# help2man expects options to start in the 2nd column
+
+sed -i "s/^\t-/ -/" $tmp/sqfscat.help
+
+# Split combined short-form/long-form options into separate short-form,
+# and long form, i.e.
+# -da[ta-queue] <size> becomes
+# -da <size>, -data-queue <size>
+
+sed -i "s/\([^ ][^ \[]*\)\[\([a-z-]*\)\] \(<[a-z-]*>\)/\1 \3, \1\2 \3/" $tmp/sqfscat.help
+sed -i "s/\([^ ][^ \[]*\)\[\([a-z-]*\)\]/\1, \1\2/" $tmp/sqfscat.help
+
+# help2man expects the options usage to be separated from the
+# option and operands text by at least 2 spaces.
+
+sed -i "s/\t/ /g" $tmp/sqfscat.help
+
+# Uppercase the options operands (between < and > ) to make it conform
+# more to man page standards
+
+sed -i "s/<[^>]*>/\U&/g" $tmp/sqfscat.help
+
+# Remove the "<" and ">" around options operands to make it conform
+# more to man page standards
+
+sed -i -e "s/<//g" -e "s/>//g" $tmp/sqfscat.help
+
+# help2man doesn't deal well with the list of supported compressors.
+# So concatenate them onto one line with commas
+
+sed -i "/^Decompressors available:/ {
+n
+s/^ //
+
+: again
+N
+/\n$/b
+
+s/\n */, /
+b again
+}" $tmp/sqfscat.help
+
+# Concatenate the options text on to one line. Add a full stop to the end of the
+# options text
+
+sed -i "/^ -/ {
+:again
+N
+/\n$/b print
+/\n -/b print
+s/\n */ /
+b again
+
+:print
+s/\([^.]\)\n/\1.\n/
+P
+s/^.*\n//
+/^ -/b again
+}" $tmp/sqfscat.help
+
+# Concatenate the exit status text on to one line.
+
+sed -i "/^ [012]/ {
+:again
+N
+/\n$/b print
+/\n [012]/b print
+s/\n */ /
+b again
+
+:print
+P
+s/^.*\n//
+/^ [012]/b again
+}" $tmp/sqfscat.help
+
+# Make Decompressors available header into a manpage section
+
+sed -i "s/\(Decompressors available\):/*\1*/" $tmp/sqfscat.help
+
+# Make Exit status header into a manpage section
+
+sed -i "s/\(Exit status\):/*\1*/" $tmp/sqfscat.help
+
+# Add reference to manpages for other squashfs-tools programs
+sed -i "s/See also:/See also:\nmksquashfs(1), unsquashfs(1), sqfstar(1)\n/" $tmp/sqfscat.help
+
+# Make See also header into a manpage section
+
+sed -i "s/\(See also\):/*\1*/" $tmp/sqfscat.help
+
+if ! help2man -Ni sqfscat.h2m -o $2 $tmp/sqfscat.sh; then
+ error "$0: help2man returned error. Aborting"
+ exit 1
+fi
+
+rm -rf $tmp