docs/.template-helpers/variant.sh

161 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
set -eo pipefail
repo="$1"
if [ -z "$repo" ]; then
echo >&2 "usage: $0 repo"
echo >&2 " ie: $0 hylang"
exit 1
fi
dir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
repoDir="$dir/../$repo"
# prints "$2$1$3$1...$N"
join() {
local sep="$1"; shift
local out; printf -v out "${sep//%/%%}%s" "$@"
echo "${out#$sep}"
}
commaJoin() {
local items=( $(xargs -n1 <<<"$1" | sort -u) ); shift
local sep=', '
case "${#items[@]}" in
0)
return
;;
1)
echo "$items"
return
;;
2)
sep=' '
;;
esac
items[-1]="or ${items[-1]}"
join "$sep" "${items[@]}"
}
tagFiles() {
local tag="$1"; shift
local tagUltimate="${tag##*-}" # 3.6-stretch -> stretch
local tagPenultimate="${tag%-*}" # 2.7.15-windowsservercore-1803 -> 2.7.15-windowsservercore
tagPenultimate="${tagPenultimate##*-}" # 2.7.15-windowsservercore -> windowsservercore
echo \
"$repoDir/variant-$tag.md" \
"$repoDir/variant-$tagUltimate.md" \
"$repoDir/variant-$tagPenultimate.md" \
"$dir/variant-$tag.md" \
"$dir/variant-$tagUltimate.md" \
"$dir/variant-$tagPenultimate.md"
}
_repo() {
local repo=$1; shift
# if we haven't set BASHBREW_LIBRARY explicitly (like Jenkins does, for example), don't trust the local library
if [ -z "${BASHBREW_LIBRARY:-}" ]; then
repo="https://github.com/docker-library/official-images/raw/master/library/$repo"
fi
echo "$repo"
}
bbRepo="$(_repo "$repo")"
IFS=$'\n'
tags=( $(bashbrew cat -f '
{{- $archSpecific := getenv "ARCH_SPECIFIC_DOCS" -}}
{{- range ($archSpecific | ternary (archFilter arch .Entries) .Entries) -}}
{{- join "\n" .Tags -}}
{{- "\n" -}}
{{- end -}}
' "$bbRepo") )
unset IFS
text=
declare -A includedFiles=()
for tag in "${tags[@]}"; do
for f in $(tagFiles "$tag"); do
if [ -n "${includedFiles[$f]}" ]; then
# make sure we don't duplicate variant sections
break
fi
if [ -f "$f" ]; then
includedFiles[$f]=1
if [ -s "$f" ]; then
# an empty file can be used to disable a specific "variant" section for an image
text+=$'\n' # give a little space
text+="$(< "$f")"
text+=$'\n' # parameter expansion eats the trailing newline
fi
break
fi
done
done
if [ -n "$text" ]; then
default="$([ -f "$repoDir/variant.md" ] && cat "$repoDir/variant.md" || cat "$dir/variant.md")"
default+=$'\n' # parameter expansion eats the trailing newline
if [ "$repo" != 'debian' ] && [ "$repo" != 'ubuntu' ]; then
# what is 'jessie', 'stretch' and 'sid'
# https://github.com/docker-library/python/issues/343
debian=( $(bashbrew list --uniq "$(_repo 'debian')" | grep -vE 'stable|slim|backports|experimental|testing' | cut -d: -f2) )
ubuntu=( $(bashbrew list "$(_repo 'ubuntu')" | grep -vE 'devel|latest|[0-9]' | cut -d: -f2) )
foundDebianTags=
foundUbuntuTags=
for tag in ${tags[@]}; do
for suite in "${debian[@]}"; do
case "$tag" in
*-"$suite" | "$suite"-* | *-"$suite"-* | "$suite" )
foundDebianTags+=" $suite"
;;
esac
done
for suite in "${ubuntu[@]}"; do
case "$tag" in
*-"$suite" | "$suite"-* | *-"$suite"-* | "$suite" )
foundUbuntuTags+=" $suite"
;;
esac
done
done
if [ -n "$foundDebianTags" ]; then
default+=$'\n' # give a little space
default+="$( sed -e 's/%%DEB-SUITES%%/'"$(commaJoin "$foundDebianTags")"'/' "$dir/variant-default-debian.md" )"
default+=$'\n' # parameter expansion eats the trailing newline
fi
if [ -n "$foundUbuntuTags" ]; then
default+=$'\n' # give a little space
default+="$( sed -e 's/%%DEB-SUITES%%/'"$(commaJoin "$foundUbuntuTags")"'/' "$dir/variant-default-ubuntu.md" )"
default+=$'\n' # parameter expansion eats the trailing newline
fi
fi
# buildpack-deps text
potentialTags="$(bashbrew list --uniq "$bbRepo" | cut -d: -f2)"
for tag in $potentialTags; do
baseImage="$(bashbrew cat -f '{{ .ArchLastStageFrom (.TagEntry.Architectures | first) .TagEntry }}' "$bbRepo:$tag" 2>/dev/null)"
case "$baseImage" in
buildpack-deps:*-*) ;; # "scm", "curl" -- not large images
buildpack-deps:*)
default+=$'\n' # give a little space
default+="$(< "$dir/variant-default-buildpack-deps.md")"
default+=$'\n' # parameter expansion eats the trailing newline
break
;;
esac
done
echo
echo
echo -n "$default"
echo "$text"
fi