mirror of
https://github.com/containers/podman.git
synced 2025-07-17 17:43:23 +08:00

* Incorporate changes from abandoned #9918: Use dedicated `bin` sub-directories for `windows` and `darwin` when building `podman-remote`. The linux flavor remains under `bin` as before. * Fix MacOS Documentation-generation for release-packaging. The `install-podman-remote-%-docs` target requires local execution of `podman-remote`, but it was assuming GOOS=linux. Fix this by dynamically discovering the local OS/architecture type while still permitting cross-building of MacOS binaries under Linux. * Unify temporary directory/file behavior to use a common template. In case of left-over temporary items left in the repository, update the `clean` target accordingly to remove them. * Fix broken podman-remote-static and MacOS release archive targets mismatching the `podman-remote-%` target. Disambiguate this target for all platforms by spelling each out in full, instead of using a wild-card recipe. * Fix Windows-installer target to properly recognize existing output files and not constantly rebuild every time. * Include the podman version number in the Windows-installer target in case a user downloads multiple releases. * Include a subdirectory containing the podman version number for both `tar.gz` and `zip` targets. This prevents users clobbering existing directories when un-archiving from releases. Signed-off-by: Chris Evich <cevich@redhat.com>
165 lines
4.4 KiB
Bash
Executable File
165 lines
4.4 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
|
|
|
|
# Overriden for testing. Native podman-remote binary expected filepaths
|
|
if [[ -z "$PODMAN" ]]; then
|
|
case $(env -i HOME=$HOME PATH=$PATH go env GOOS) in
|
|
windows)
|
|
PODMAN=bin/windows/podman.exe ;;
|
|
darwin)
|
|
PODMAN=bin/darwin/podman ;;
|
|
*) # Assume "linux"
|
|
PODMAN=bin/podman-remote ;;
|
|
esac
|
|
fi
|
|
|
|
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
|