diff --git a/release.sh b/release.sh new file mode 100755 index 00000000..a2324c37 --- /dev/null +++ b/release.sh @@ -0,0 +1,159 @@ +#!/bin/bash + +repo=pwr-Solaar/Solaar + +usage() { + basename="$(basename $0)" + cat </dev/null +[ $? -eq 0 ] && prerelease=true + +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 + +read -p 'Are you sure you want to proceed? (y/n) ' -n 1 -r < /dev/tty +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo 'Release aborted.' + exit 1 +fi + +read -p 'Are you *really* sure you want to proceed? (y/n) ' -n 1 -r < /dev/tty +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo 'Release aborted.' + exit 1 +fi + +# Check for uncomitted changes +git diff --quiet HEAD >/dev/null +[ $? -ne 0 ] && echo -e '\nError: Uncomitted 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 + +# Check if version is in the changelog +grep "^$version:" ChangeLog >/dev/null +[ $? -ne 0 ] && echo 'Error: Version is not present in the changelog' && 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 +} > /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 + +# Create github release +body() { + cat </dev/null | jq -r .html_url) +[ -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