summaryrefslogtreecommitdiffstats
path: root/docs/remote-docs.sh
blob: afc9248287e3b02455ef501fa3dfebfb6d3fbf0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/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

# This is a *native* binary, one we can run on this host. (This script can be
# invoked in a cross-compilation environment, so even if PLATFORM=windows
# we need an actual executable that we can invoke).
if [[ -z "$PODMAN" ]]; then
    DETECTED_OS=$(env -i HOME="$HOME" PATH="$PATH" GOROOT="$GOROOT" go env GOOS)
    case $DETECTED_OS 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, windows or freebsd."
    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|freebsd)
    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 --standalone --from markdown-smart \
        --lua-filter=docs/links-to-html.lua \
        --lua-filter=docs/use-pagetitle.lua \
        -o $TARGET/${file%%.*}.html $markdown
}

function html_standalone() {
    local markdown=$1
    local title=$2
    local file=$(basename $markdown)
    local dir=$(dirname $markdown)
    (cd $dir; pandoc --ascii --from markdown-smart -c ../standalone-styling.css \
           --standalone --self-contained --metadata title="$2" -V title= \
           $file)  > $TARGET/${file%%.*}.html
}

# 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
if [[ "$PLATFORM" == "windows" ]]; then
    html_standalone docs/tutorials/podman-for-windows.md 'Podman for Windows'
fi