Solaar/release.sh

173 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
repo=pwr-Solaar/Solaar
usage() {
basename="$(basename $0)"
cat <<HELP
Usage: $basename [options]
Options:
--dry-run Does everything except tagging
--help Display this help and exit successfully
HELP
}
while [ $# != 0 ]
do
case $1 in
--dry-run)
DRY_RUN=yes
;;
--*)
echo ""
echo "Error: unknown option: $1"
echo ""
usage
exit 1
;;
-*)
echo ""
echo "Error: unknown option: $1"
echo ""
usage
exit 1
;;
esac
shift
done
version=$(cat lib/solaar/version)
prerelease=false
echo $version | grep '.*rc.*' >/dev/null
[ $? -eq 0 ] && prerelease=true
stable_branch=stable
ref=$(git symbolic-ref HEAD)
[ $? -ne 0 ] && echo 'Error: Failed current branch' && exit 1
branch=${ref##*/}
commit=$(git rev-list --max-count=1 HEAD)
[ $? -ne 0 ] && echo 'Error: Failed to get HEAD' && exit 1
remote=$(git config --get branch.$branch.remote)
[ $? -ne 0 ] && echo 'Error: Failed to get remote' && exit 1
remote_ref=$(git config --get branch.$branch.merge)
[ $? -ne 0 ] && echo 'Error: Failed to get remote HEAD' && exit 1
remote_branch=${remote_ref##*/}
github_token=$(cat ~/.github-token)
[ $? -ne 0 ] && echo 'Error: Failed to get github token (check ~/.github_token)' && exit 1
jq -V >/dev/null
[ $? -ne 0 ] && echo 'Error: jq is not installed' && exit 1
echo -e "\n\t** You are tagging a release for version $version **\n"
echo "Version: $version"
echo "Commit: $commit"
echo "Pre-release: $prerelease"
echo "Remote: $remote"
if [ "$branch" == "$remote_branch" ]; then
echo "Branch: $branch"
else
echo "Local branch: $branch"
echo "Remote branch: $remote_branch"
fi
echo -e '\nPlease read RELEASE.md before continuing.\n'
read -p 'Are you sure you want to proceed? (y/n) ' -n 1 -r < /dev/tty
echo
[[ ! $REPLY =~ ^[Yy]$ ]] && echo 'Release aborted.' && exit 1
read -p 'Are you *really* sure you want to proceed? (y/n) ' -n 1 -r < /dev/tty
echo
[[ ! $REPLY =~ ^[Yy]$ ]] && echo 'Release aborted.' && exit 1
# Check if version is in the changelog
grep '^# '"$version" CHANGELOG.md >/dev/null
[ $? -ne 0 ] && echo 'Error: Version is not present in the changelog' && exit 1
# Check for uncommitted changes
git diff --quiet HEAD >/dev/null
[ $? -ne 0 ] && echo -e '\nError: Uncommitted changes found' && exit 1
# Check if commit is a version bump
git show -s --format=%B HEAD | grep "^release $version">/dev/null
#[ $? -ne 0 ] && echo -e '\nError: Commit does not look like a version bump' && exit 1
# Check if commit has been pushed to remote
remote_commit=$(git rev-list --max-count=1 $remote/$branch)
[ $? -ne 0 ] && echo -e '\nError: Failed to get remote HEAD' && exit 1
[ "$commit" != "$remote_commit" ] && echo -e '\nError: Commit has not been pushed to the remote' && exit 1
# Check if tag already exists
git rev-list --max-count=1 $version >/dev/null 2>/dev/null
[ $? -eq 0 ] && echo -e '\nError: Tag already exists' && exit 1
# Check if tag already exists on remote
git ls-remote $remote | grep "refs/tags/$version$" >/dev/null
[ $? -eq 0 ] && echo -e '\nError: Tag already exists on remote' && exit 1
echo
# Create tag
echo 'Creating tag...'
{
echo "release $version"
echo
found=no
while read -r line; do
if [[ "$line" == "# "* ]]; then
[ "$line" == "# $version" ] && found=yes || found=no
fi
[ "$found" == 'yes' ] && [ "${line:0:1}" == '*' ] && echo "$line"
done < CHANGELOG.md
} > /tmp/solaar-changelog
[ -z "$DRY_RUN" ] && git tag -s $version -F /tmp/solaar-changelog >/dev/null || true
[ $? -ne 0 ] && echo -e '\nError: Failed to create tag' && exit 1
# Push tag
echo 'Pushing tag...'
[ -z "$DRY_RUN" ] && git push $remote $version >/dev/null || true
[ $? -ne 0 ] && echo -e '\nError: Failed to push tag' && exit 1
# Point stable branch to latest version tag
echo 'Updating stable branch...'
if [[ -z "$DRY_RUN" && $prerelease == "false" ]]
then
# Check if stable branch does not exist
git rev-list --max-count=1 $stable_branch >/dev/null 2>/dev/null
[ $? -ne 0 ] && echo -e '\nWarning: Creating stable branch for a first time' && git branch $stable_branch
# Fast forward and push stable branch
git checkout $stable_branch
git merge --ff $version
git push $remote $stable_branch >/dev/null || true
git checkout $branch
fi
# Create github release
body() {
cat <<EOF
{
"tag_name": "$version",
"name": "$version",
"body": "$(awk '{printf "%s\\n", $0}' /tmp/solaar-changelog)",
"prerelease": $prerelease,
"draft": false
}
EOF
}
echo 'Creating github release...'
##[ -z "$DRY_RUN" ] && url=$(curl -X POST --data "$(body)" "https://api.github.com/repos/$repo/releases?access_token=$github_token" 2>/dev/null | jq -r .html_url)
[ -z "$DRY_RUN" ] && url=$(curl -H 'Authorization: $github_token' -X POST --data "$(body)" "https://api.github.com/repos/$repo/releases" 2>/dev/null | jq -r .html_url)
[ -z "$DRY_RUN" ] && [ -z "$url" ] && echo -e '\nError: Failed to create a github release' && exit 1
[ -z "$DRY_RUN" ] && echo -e "\nRelease created: $url"
rm /tmp/solaar-changelog