#!/bin/bash repo=pwr-Solaar/Solaar usage() { basename="$(basename $0)" cat </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 </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