* feature: update rust-toolchain * add(ci): action that updates `rust-toolchain` We purposefully keep our version a little behind the newest releases, to give people the time to update. Now this is unambigious and we can use all the features our current toolchain allows.
68 lines
1.9 KiB
Bash
Executable file
68 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
# dependencies: bash, curl, jq
|
|
#
|
|
# Updates a rust-toolchain file in relation to the official rust releases.
|
|
|
|
# How many minor versions delta there should be,
|
|
# will automatically advance patch versions.
|
|
MINOR_DELTA=2
|
|
RUST_TOOLCHAIN_VERSION=$(grep -oP 'channel = "\K[^"]+' "./rust-toolchain")
|
|
#RUST_TOOLCHAIN_FILE=../../rust-toolchain
|
|
RUST_TOOLCHAIN_FILE=./rust-toolchain
|
|
|
|
# update with new version number
|
|
update_channel(){
|
|
printf \
|
|
"
|
|
# This file is updated by \`update-toolchain.sh\`
|
|
# We aim to be around 1-2 rust releases behind in order
|
|
# to get people the time to update their toolchains properly.
|
|
# By enforcing this, we can also make full use of the features
|
|
# provided by the current channel.
|
|
|
|
"
|
|
sed -e "/channel/s/\".*\"/\"$1\"/" "${RUST_TOOLCHAIN_FILE}"
|
|
}
|
|
|
|
get_last_no_releases() {
|
|
curl --silent "https://api.github.com/repos/rust-lang/rust/releases" | \
|
|
jq '.[range(20)].tag_name' | sed -e 's/\"//g'
|
|
}
|
|
|
|
function parse_semver() {
|
|
local token="$1"
|
|
local major=0
|
|
local minor=0
|
|
local patch=0
|
|
|
|
if grep -E '^[0-9]+\.[0-9]+\.[0-9]+' <<<"$token" >/dev/null 2>&1 ; then
|
|
local n=${token//[!0-9]/ }
|
|
local a=(${n//\./ })
|
|
major=${a[0]}
|
|
minor=${a[1]}
|
|
patch=${a[2]}
|
|
fi
|
|
|
|
echo "$major $minor $patch"
|
|
}
|
|
function get_string_arrary() {
|
|
IFS=' ' read -r -a array <<< "$1";
|
|
echo "${array["${2}"]}"
|
|
}
|
|
|
|
RUST_TOOLCHAIN_VERSION="$(parse_semver $(echo $RUST_TOOLCHAIN_VERSION))"
|
|
TARGET_TOOLCHAIN_MINOR_VERSION=$(($(get_string_arrary "${RUST_TOOLCHAIN_VERSION}" 1) - MINOR_DELTA))
|
|
|
|
LATEST=0
|
|
for i in $(get_last_no_releases);do
|
|
SEMVER=($(parse_semver "$i"))
|
|
if [ "$LATEST" != "${SEMVER[1]}" ];then
|
|
MINOR_DELTA=$((MINOR_DELTA - 1))
|
|
fi
|
|
LATEST="${SEMVER[1]}"
|
|
if [ -1 == "${MINOR_DELTA}" ];then
|
|
echo "$(update_channel "$i")"> ${RUST_TOOLCHAIN_FILE}
|
|
exit
|
|
fi
|
|
done
|