From 300a2a242c359143495c7eca236d7b1a9b93e4d2 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 24 Jul 2024 23:10:57 -0700 Subject: [PATCH] Add release script --- scripts/release.sh | 248 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100755 scripts/release.sh diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 000000000..697ee6854 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,248 @@ +#!/usr/bin/env bash +set -e + +# On macOS, gsed is required (brew install gnu-sed) +# Required tools: jq, gh +# The GitHub cli (gh) has to be properly authenticated + +# These variables can be modified as needed +MAGISK_FILES=../magisk-files +CONFIG=config.prop +NOTES=notes.md + +# These are constants, do not modify +GCONFIG=gradle.properties +README=README.MD +BUILDCMD="./build.py -c $CONFIG" +CWD=$(pwd) + +grep_prop() { + local REGEX="s/^$1=//p" + shift + local FILES=$@ + sed -n "$REGEX" $FILES | head -n 1 +} + +enable_version_config() { + # Make sure version is not commented out and exists + sed -i "s:^# version=:version=:g" $CONFIG + if ! grep -qE '^version=' $CONFIG; then + echo 'version=' >> $CONFIG + fi +} + +disable_version_config() { + # Comment out version config + sed -i "s:^version=:# version=:g" $CONFIG +} + +# $1 = tag +update_readme_stable() { + sed -i "s:badge/Magisk-v.*:badge/Magisk-${1}-blue)](https\://github.com/topjohnwu/Magisk/releases/tag/$1):g" $README +} + +# $1 = tag +update_readme_beta() { + sed -i "s:badge/Magisk%20Beta.*:badge/Magisk%20Beta-${1}-blue)](https\://github.com/topjohnwu/Magisk/releases/tag/$1):g" $README +} + +# $1 = tag +update_readme_canary() { + sed -i "s:badge/Magisk-Canary.*:badge/Magisk-Canary-red)](https\://github.com/topjohnwu/Magisk/releases/tag/$1):g" $README +} + +gen_link() { + echo "https://github.com/topjohnwu/Magisk/releases/download/$1/$2" +} + +update_canary_json() { + local ver=$(grep_prop version $CONFIG) + local code=$(grep_prop magisk.versionCode $GCONFIG) + local tag="canary-$code" + local json + + json=$MAGISK_FILES/canary.json + jq ".magisk.version=\"$ver\"|.magisk.versionCode=\"$code\"| + .magisk.link=\"$(gen_link $tag app-release.apk)\"| + .magisk.note=\"$(gen_link $tag notes.md)\"" $json > ${json}.tmp + mv ${json}.tmp $json + + json=$MAGISK_FILES/debug.json + jq ".magisk.version=\"$ver\"|.magisk.versionCode=\"$code\"| + .magisk.link=\"$(gen_link $tag app-debug.apk)\"| + .magisk.note=\"$(gen_link $tag notes.md)\"" $json > ${json}.tmp + mv ${json}.tmp $json +} + +# $1 = json path +update_release_json() { + local json=$1 + local ver=$(grep_prop version $CONFIG) + local code=$(grep_prop magisk.versionCode $GCONFIG) + + jq ".magisk.version=\"$ver\"|.magisk.versionCode=\"$code\"| + .magisk.link=\"$(gen_link v${ver} Magisk-v${ver}.apk)\"| + .magisk.note=\"https://topjohnwu.github.io/Magisk/releases/${code}.md\"" $json > ${json}.tmp + mv ${json}.tmp $json +} + +build_canary() { + enable_version_config + + # Update version code + local code=$(grep_prop magisk.versionCode $GCONFIG) + code=$((code + 1)) + local tag="canary-$code" + sed -i "s:versionCode=.*:versionCode=${code}:g" $GCONFIG + update_readme_canary $tag + + # Commit version code changes + git add -u . + git status + git commit -m "Release new canary build" + git tag $tag + + # Update version name + local ver=$(git rev-parse --short=8 HEAD) + sed -i "s:version=.*:version=${ver}:g" $CONFIG + sed -i "s:## Magisk (.*:## Magisk (${ver}) (${code}):g" $NOTES + + # Update and commit JSON + update_canary_json + cd $MAGISK_FILES + git add -u . + git status + git commit -m "Update Canary Channel: Upstream to $ver" + cd $CWD + + # Build + $BUILDCMD clean + $BUILDCMD all + $BUILDCMD -r all + + disable_version_config +} + +# $1 = ver, $2 = stable? +build_release() { + enable_version_config + + # Update version configs + local ver=$1 + local stable=$2 + local code=$(echo - | awk "{ print $ver * 1000 }") + local tag="v$ver" + sed -i "s:versionCode=.*:versionCode=${code}:g" $GCONFIG + sed -i "s:version=.*:version=${ver}:g" $CONFIG + + # Update and commit JSON + if $stable; then + update_readme_stable $tag + update_readme_beta $tag + update_release_json $MAGISK_FILES/stable.json + cp -vf $MAGISK_FILES/stable.json $MAGISK_FILES/beta.json + else + update_readme_beta $tag + update_release_json $MAGISK_FILES/beta.json + fi + cd $MAGISK_FILES + git add -u . + git status + git commit -m "Release Magisk v$ver" + cd $CWD + + # Commit version code changes + git add -u . + git status + git commit -m "Release Magisk v$ver" + git tag $tag + + # Build + $BUILDCMD clean + $BUILDCMD -r all + + disable_version_config +} + +stable() { + [ -z $1 ] && exit 1 + local ver=$1 + build_release $ver true +} + +beta() { + [ -z $1 ] && exit 1 + local ver=$1 + build_release $ver false +} + +pub() { + gh auth status + + local latest_tag=$(git describe --abbrev=0 --tags) + local ver=$(grep_prop version $CONFIG) + local code=$(grep_prop magisk.versionCode $GCONFIG) + local out=$(grep_prop outdir $CONFIG) + local tag title + + if [ -z $out ]; then + out=out + fi + + git push origin master + git push --tags + + if [ $(($code % 100)) -ne 0 ]; then + tag="canary-$code" + title="Magisk ($ver) ($code)" + + # Assert tag format + [ $latest_tag = $tag ] + + # Publish release + tail -n +3 $NOTES > release.md + gh release create --verify-tag $tag -p -t "$title" -F release.md $out/app-release.apk $out/app-debug.apk $NOTES + else + tag="v$ver" + title="Magisk v$ver" + + # Assert tag format + [ $latest_tag = $tag ] + + # Publish release + tail -n +3 docs/releases/$code.md > release.md + gh release create --verify-tag $tag -t "$title" -F release.md "$out/app-release.apk#Magisk-v${ver}.apk" + fi + + rm -f release.md + cd $MAGISK_FILES + git push origin master + cd $CWD +} + +revert() { + local latest_tag=$(git describe --abbrev=0 --tags) + + git tag -d $latest_tag + git reset --hard HEAD~ + cd $MAGISK_FILES + git reset --hard HEAD~ + cd $CWD +} + +# Use GNU sed on macOS +if command -v gsed >/dev/null; then + function sed() { gsed "$@"; } + export -f sed +fi + +git pull + +case $1 in + "canary" ) build_canary ;; + "stable" ) stable $2 ;; + "beta" ) beta $2 ;; + "pub" ) pub ;; + "revert" ) revert ;; + * ) exit 1 ;; +esac