mirror of
https://github.com/joomla-docker/docker-joomla.git
synced 2024-11-16 10:05:23 +00:00
186 lines
5.3 KiB
Bash
Executable File
186 lines
5.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
|
|
self="$(basename "$BASH_SOURCE")"
|
|
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
|
|
|
|
if [ "$#" -eq 0 ]; then
|
|
versions="$(jq -r 'keys | map(@sh) | join(" ")' versions.json)"
|
|
eval "set -- $versions"
|
|
fi
|
|
|
|
# sort version numbers with highest first
|
|
IFS=$'\n'
|
|
set -- $(sort -rV <<<"$*")
|
|
unset IFS
|
|
|
|
# get the most recent commit which modified any of "$@"
|
|
fileCommit() {
|
|
git log -1 --format='format:%H' HEAD -- "$@"
|
|
}
|
|
|
|
# get the most recent commit which modified "$1/Dockerfile" or any file COPY'd from "$1/Dockerfile"
|
|
dirCommit() {
|
|
local dir="$1"
|
|
shift
|
|
(
|
|
cd "$dir"
|
|
fileCommit \
|
|
Dockerfile \
|
|
$(git show HEAD:./Dockerfile | awk '
|
|
toupper($1) == "COPY" {
|
|
for (i = 2; i < NF; i++) {
|
|
if ($i ~ /^--from=/) {
|
|
next
|
|
}
|
|
print $i
|
|
}
|
|
}
|
|
')
|
|
)
|
|
}
|
|
|
|
gawkParents='
|
|
{ cmd = toupper($1) }
|
|
cmd == "FROM" {
|
|
print $2
|
|
next
|
|
}
|
|
cmd == "COPY" {
|
|
for (i = 2; i < NF; i++) {
|
|
if ($i ~ /^--from=/) {
|
|
gsub(/^--from=/, "", $i)
|
|
print $i
|
|
next
|
|
}
|
|
}
|
|
}
|
|
'
|
|
|
|
getArches() {
|
|
local repo="$1"
|
|
shift
|
|
|
|
local parentRepoToArchesStr
|
|
parentRepoToArchesStr="$(
|
|
find -name 'Dockerfile' -exec gawk "$gawkParents" '{}' + |
|
|
sort -u |
|
|
gawk -v officialImagesUrl='https://github.com/docker-library/official-images/raw/master/library/' '
|
|
$1 !~ /^('"$repo"'|scratch|.*\/.*)(:|$)/ {
|
|
printf "%s%s\n", officialImagesUrl, $1
|
|
}
|
|
' |
|
|
xargs -r bashbrew cat --format '["{{ .RepoName }}:{{ .TagName }}"]="{{ join " " .TagEntry.Architectures }}"'
|
|
)"
|
|
eval "declare -g -A parentRepoToArches=( $parentRepoToArchesStr )"
|
|
}
|
|
getArches 'joomla'
|
|
|
|
# get the Joomla maintainers of these docker images
|
|
joomlaMaintainers="$(jq -cr '. | map(.firstname + " " + .lastname + " <" + .email + "> (@" + .github + ")") | join(",\n ")' maintainers.json)"
|
|
|
|
cat <<-EOH
|
|
# this file is generated via https://github.com/joomla-docker/docker-joomla/blob/$(fileCommit "$self")/$self
|
|
|
|
Maintainers: $joomlaMaintainers
|
|
GitRepo: https://github.com/joomla-docker/docker-joomla.git
|
|
EOH
|
|
|
|
# prints "$2$1$3$1...$N"
|
|
join() {
|
|
local sep="$1"
|
|
shift
|
|
local out
|
|
printf -v out "${sep//%/%%}%s" "$@"
|
|
echo "${out#$sep}"
|
|
}
|
|
|
|
for version; do
|
|
export version
|
|
# get this Joomla versions PHP versions
|
|
phpVersions="$(jq -r '.[env.version].phpVersions | map(@sh) | join(" ")' versions.json)"
|
|
eval "phpVersions=( $phpVersions )"
|
|
# get this Joomla versions default PHP version
|
|
defaultPhpVersion="$(jq -r '.[env.version].php' versions.json)"
|
|
# get this Joomla versions variants
|
|
variants="$(jq -r '.[env.version].variants | map(@sh) | join(" ")' versions.json)"
|
|
eval "variants=( $variants )"
|
|
# get this Joomla versions default variant
|
|
defaultVariant="$(jq -r '.[env.version].variant' versions.json)"
|
|
# get the Joomla versions full version eg: 4.0.0
|
|
fullVersion="$(jq -r '.[env.version].version' versions.json)"
|
|
# check if this Joomla version is a Release Candidate
|
|
rcVersion="${version%-rc}"
|
|
versionAliases=()
|
|
while [ "$fullVersion" != "$rcVersion" -a "${fullVersion%[.]*}" != "$fullVersion" ]; do
|
|
versionAliases+=($fullVersion)
|
|
fullVersion="${fullVersion%[.]*}"
|
|
done
|
|
# get all that aliases of this Joomla version
|
|
aliases="$(jq -r '.[env.version].aliases | map(@sh) | join(" ")' versions.json)"
|
|
eval "aliases=( $aliases )"
|
|
# add the short version an all aliases found
|
|
versionAliases+=(
|
|
$version
|
|
${aliases[@]:-}
|
|
)
|
|
|
|
for phpVersion in "${phpVersions[@]}"; do
|
|
phpVersion="php$phpVersion"
|
|
for variant in "${variants[@]}"; do
|
|
dir="$version/$phpVersion/$variant"
|
|
# check if the docker file exist, else skip
|
|
[ -f "$dir/Dockerfile" ] || continue
|
|
# get the commit hash from this docker file
|
|
commit="$(dirCommit "$dir")"
|
|
|
|
phpVersionAliases=("${versionAliases[@]/%/-$phpVersion}")
|
|
phpVersionAliases=("${phpVersionAliases[@]//latest-/}")
|
|
|
|
variantSuffixes=("$variant")
|
|
|
|
variantAliases=()
|
|
phpVersionVariantAliases=()
|
|
for variantSuffix in "${variantSuffixes[@]}"; do
|
|
variantAliases+=("${versionAliases[@]/%/-$variantSuffix}")
|
|
phpVersionVariantAliases+=("${phpVersionAliases[@]/%/-$variantSuffix}")
|
|
done
|
|
variantAliases=("${variantAliases[@]//latest-/}")
|
|
phpVersionVariantAliases=("${phpVersionVariantAliases[@]//latest-/}")
|
|
|
|
fullAliases=()
|
|
if [ "$phpVersion" = "php$defaultPhpVersion" ] && [ "$variant" = "$defaultVariant" ]; then
|
|
fullAliases+=("${versionAliases[@]}")
|
|
fullAliases+=("${variantAliases[@]}")
|
|
fullAliases+=("${phpVersionAliases[@]}")
|
|
fi
|
|
fullAliases+=("${phpVersionVariantAliases[@]}")
|
|
|
|
variantParents="$(gawk "$gawkParents" "$dir/Dockerfile")"
|
|
variantArches=
|
|
for variantParent in $variantParents; do
|
|
parentArches="${parentRepoToArches[$variantParent]:-}"
|
|
if [ -z "$parentArches" ]; then
|
|
continue
|
|
elif [ -z "$variantArches" ]; then
|
|
variantArches="$parentArches"
|
|
else
|
|
variantArches="$(
|
|
comm -12 \
|
|
<(xargs -n1 <<<"$variantArches" | sort -u) \
|
|
<(xargs -n1 <<<"$parentArches" | sort -u)
|
|
)"
|
|
fi
|
|
done
|
|
|
|
echo
|
|
cat <<-EOE
|
|
Tags: $(join ', ' "${fullAliases[@]}")
|
|
Architectures: $(join ', ' $variantArches)
|
|
GitCommit: $commit
|
|
Directory: $dir
|
|
EOE
|
|
done
|
|
done
|
|
done
|