173 lines
5.1 KiB
Bash
Executable File
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
|