119 lines
3.7 KiB
Bash
Executable File
119 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
|
|
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
|
|
|
|
versions=( "$@" )
|
|
if [ ${#versions[@]} -eq 0 ]; then
|
|
versions=( */ )
|
|
json='{}'
|
|
else
|
|
json="$(< versions.json)"
|
|
fi
|
|
versions=( "${versions[@]%/}" )
|
|
|
|
yq='./.yq'
|
|
# https://github.com/mikefarah/yq/releases
|
|
# TODO detect host architecture
|
|
yqUrl='https://github.com/mikefarah/yq/releases/download/v4.40.5/yq_linux_amd64'
|
|
yqSha256='0d6aaf1cf44a8d18fbc7ed0ef14f735a8df8d2e314c4cc0f0242d35c0a440c95'
|
|
if command -v yq &> /dev/null; then
|
|
# TODO verify that the "yq" in PATH is https://github.com/mikefarah/yq, not the python-based version you'd get from "apt-get install yq" somehow? maybe they're compatible enough for our needs that it doesn't matter?
|
|
yq='yq'
|
|
elif [ ! -x "$yq" ] || ! sha256sum <<<"$yqSha256 *$yq" --quiet --strict --check; then
|
|
wget -qO "$yq.new" "$yqUrl"
|
|
sha256sum <<<"$yqSha256 *$yq.new" --quiet --strict --check
|
|
chmod +x "$yq.new"
|
|
"$yq.new" --version
|
|
mv "$yq.new" "$yq"
|
|
fi
|
|
|
|
releases="$(
|
|
wget -qO- 'https://github.com/ruby/www.ruby-lang.org/raw/master/_data/releases.yml' \
|
|
| "$yq" -r '@json' # this *should* work on both the Go-based "yq" we download and the Python-based "yq" available from Debian's APT repo
|
|
)"
|
|
|
|
for version in "${versions[@]}"; do
|
|
rcGrepV='-v'
|
|
rcVersion="${version%-rc}"
|
|
if [ "$rcVersion" != "$version" ]; then
|
|
rcGrepV=
|
|
fi
|
|
export version rcVersion
|
|
|
|
doc="$(jq <<<"$releases" -c '
|
|
map(
|
|
select(
|
|
.version
|
|
# exact versions ("3.1.0-preview1") should match exactly but "X.Y" or "X.Y-rc" should fuzzy match appropriately
|
|
| . == env.version or (
|
|
(
|
|
startswith(env.rcVersion + ".")
|
|
or startswith(env.rcVersion + "-")
|
|
) and (
|
|
contains("preview") or contains("rc")
|
|
| if env.version == env.rcVersion then not else . end
|
|
)
|
|
)
|
|
)
|
|
)
|
|
| first // empty
|
|
')"
|
|
|
|
if [ -z "$doc" ]; then
|
|
echo >&2 "warning: skipping/removing '$version' (does not appear to exist upstream)"
|
|
json="$(jq <<<"$json" -c '.[env.version] = null')"
|
|
continue
|
|
fi
|
|
|
|
fullVersion="$(jq <<<"$doc" -r '.version')"
|
|
echo "$version: $fullVersion"
|
|
|
|
if [ "$rcVersion" != "$version" ] && gaFullVersion="$(jq <<<"$json" -er '.[env.rcVersion] | if . then .version else empty end')"; then
|
|
# Ruby pre-releases have only been for .0 since ~2011, so if our pre-release now has a relevant GA, it should go away 👀
|
|
# just in case, we'll also do a version comparison to make sure we don't have a pre-release that's newer than the relevant GA
|
|
latestVersion="$({ echo "$fullVersion"; echo "$gaFullVersion"; } | sort -V | tail -1)"
|
|
if [[ "$fullVersion" == "$gaFullVersion"* ]] || [ "$latestVersion" = "$gaFullVersion" ]; then
|
|
# "x.y.z-rc1" == x.y.z*
|
|
json="$(jq <<<"$json" -c 'del(.[env.version])')"
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
doc="$(jq <<<"$doc" -c '
|
|
.variants = [
|
|
(
|
|
"trixie",
|
|
"bookworm",
|
|
empty # trailing comma hack
|
|
| ., "slim-" + .), # https://github.com/docker-library/ruby/pull/142#issuecomment-320012893
|
|
(
|
|
"3.22",
|
|
"3.21",
|
|
empty # trailing comma hack
|
|
| "alpine" + .)
|
|
]
|
|
')"
|
|
|
|
# YJIT
|
|
doc="$(jq <<<"$doc" -sc '
|
|
.[1][].arches? |= if . then with_entries(select(.key | IN(
|
|
# https://github.com/ruby/ruby/blob/v3_2_0/doc/yjit/yjit.md ("currently supported for macOS and Linux on x86-64 and arm64/aarch64 CPUs")
|
|
# https://github.com/ruby/ruby/blob/v3_2_0/configure.ac#L3757-L3761
|
|
"amd64",
|
|
"arm64v8",
|
|
empty # trailing comma
|
|
))) else empty end
|
|
| add
|
|
' - rust.json)"
|
|
|
|
json="$(jq <<<"$json" -c --argjson doc "$doc" '.[env.version] = $doc')"
|
|
|
|
# make sure pre-release versions have a placeholder for GA
|
|
if [ "$version" != "$rcVersion" ]; then
|
|
json="$(jq <<<"$json" -c '.[env.rcVersion] //= null')"
|
|
fi
|
|
done
|
|
|
|
jq <<<"$json" 'to_entries | sort_by(.key) | from_entries' > versions.json
|