podman/docs/remote-docs.sh
Daniel J Walsh 980b1e87d4
Switch use of Flags to Options
Want to have man pages match commands, since we have lots of printed
man pages with using Options, we will change the command line to use
Options in --help.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
2020-10-21 08:37:57 -04:00

155 lines
4.2 KiB
Bash
Executable file

#!/usr/bin/env bash
# Assemble remote man pages for darwin or windows from markdown files
set -e
PLATFORM=$1 ## linux, windows or darwin
TARGET=${2} ## where to output files
SOURCES=${@:3} ## directories to find markdown files
PODMAN=${PODMAN:-bin/podman-remote} ## location overridden for testing
function usage() {
echo >&2 "$0 PLATFORM TARGET SOURCES..."
echo >&2 "PLATFORM: Is either linux, darwin or windows."
echo >&2 "TARGET: Is the directory where files will be staged. eg, docs/build/remote/linux"
echo >&2 "SOURCES: Are the directories of source files. eg, docs/source/markdown"
}
function fail() {
echo >&2 -e "$(dirname $0): $@\n"
exit 1
}
case $PLATFORM in
darwin|linux)
PUBLISHER=man_fn
ext=1
;;
windows)
PUBLISHER=html_fn
ext=1.md
;;
-help)
usage
exit 0
;;
*) fail '"linux", "darwin" and "windows" are the only supported platforms.' ;;
esac
if [[ -z $TARGET ]]; then
fail 'TARGET directory is required'
fi
if [[ -z $SOURCES ]]; then
fail 'At least one SOURCE directory is required'
fi
if [[ ! -x $PODMAN ]]; then
fail "$PODMAN does not exist"
fi
## man_fn copies the man page or link to flattened directory
function man_fn() {
local page=$1
local file=$(basename $page)
local dir=$(dirname $page)
if [[ ! -f $page ]]; then
page=$dir/links/${file%.*}.$ext
fi
install $page $TARGET/${file%%.*}.1
}
## html_fn converts the markdown page or link to HTML
function html_fn() {
local markdown=$1
local file=$(basename $markdown)
local dir=$(dirname $markdown)
if [[ ! -f $markdown ]]; then
local link=$(sed -e 's?.so man1/\(.*\)?\1?' <$dir/links/${file%.md})
markdown=$dir/$link.md
fi
pandoc --ascii --lua-filter=docs/links-to-html.lua -o $TARGET/${file%%.*}.html $markdown
}
# Run 'podman help' (possibly against a subcommand, e.g. 'podman help image')
# and return a list of each first word under 'Available Commands', that is,
# the command name but not its description.
function podman_commands() {
$PODMAN help "$@" |\
awk '/^Available Commands:/{ok=1;next}/^Options:/{ok=0}ok { print $1 }' |\
grep .
}
function podman_all_commands(){
for cmd in $(podman_commands "$@") ; do
echo $@ $cmd
podman_all_commands $@ $cmd
done
}
## pub_pages finds and publishes the remote manual pages
function pub_pages() {
local source=$1
local publisher=$2
for f in $(ls $source/podman-remote*); do
$publisher $f
done
while IFS= read -r cmd; do
file="podman-${cmd// /-}"
# Source dir may have man (.1) files (linux/darwin) or .1.md (windows)
# but the links subdir will always be .1 (man) files
if [ -f $source/$file.$ext -o -f $source/links/$file.1 ]; then
$publisher $(echo $source/$file.$ext)
else
# This is worth failing CI for
fail "no doc file nor link $source/$file.$ext for 'podman $cmd'"
fi
done <<< "$(podman_all_commands)"
}
## sed syntax is different on darwin and linux
## sed --help fails on mac, meaning we have to use mac syntax
function sed_os(){
if sed --help > /dev/null 2>&1 ; then
$(sed -i "$@")
else
$(sed -i "" "$@")
fi
}
## rename renames podman-remote.ext to podman.ext, and fixes up contents to reflect change
function rename (){
if [[ "$PLATFORM" != linux ]]; then
local remote=$(echo $TARGET/podman-remote.*)
local ext=${remote##*.}
mv $remote $TARGET/podman.$ext
sed_os "s/podman\\\*-remote/podman/g" $TARGET/podman.$ext
sed_os "s/A\ remote\ CLI\ for\ Podman\:\ //g" $TARGET/podman.$ext
case $PLATFORM in
darwin|linux)
sed_os "s/Podman\\\*-remote/Podman\ for\ Mac/g" $TARGET/podman.$ext
;;
windows)
sed_os "s/Podman\\\*-remote/Podman\ for\ Windows/g" $TARGET/podman.$ext
;;
esac
fi
}
## walk the SOURCES for markdown sources
mkdir -p $TARGET
for s in $SOURCES; do
if [[ -d $s ]]; then
pub_pages $s $PUBLISHER
else
echo >&2 "Warning: $s does not exist"
fi
done
rename