Last active
October 3, 2023 09:12
-
-
Save kaar/dc5514218fc5ecfdb608a32cfe021eb7 to your computer and use it in GitHub Desktop.
Bump pyproject.toml version, create release by pushing git tag
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -o errexit | |
set -o nounset | |
set -o pipefail | |
PROJECT_FILE=pyproject.toml | |
# Usage: | |
# ./pyversion.sh # Show current version | |
# ./pyversion.sh major # Increase major version | |
# ./pyversion.sh minor # Increase minor version | |
# ./pyversion.sh patch # Increase patch version | |
# ./pyversion.sh --release # Create a release for the current version | |
# ./pyversion.sh --help # Show help | |
# | |
# Example: | |
# ./pyversion.sh major # 1.0.0 -> 2.0.0 | |
# ./pyversion.sh minor # 1.0.0 -> 1.1.0 | |
# ./pyversion.sh patch # 1.0.0 -> 1.0.1 | |
# ./pyversion.sh # 1.0.0 | |
# | |
# https://gist.github.com/pete-otaqui/4188238 | |
# I got this link generated by GitHub copilot. It was not the inspiration | |
# for this script but got generated when the script was finished. | |
# Left a comment as a tribute: | |
# https://gist.github.com/pete-otaqui/4188238?permalink_comment_id=4711436#gistcomment-4711436 | |
function create_release { | |
current_version=$(grep -oP '^version = "\K[^"]+' pyproject.toml) | |
read -p "Do you want to create a release for v$current_version? (y/n) " -n 1 -r | |
echo | |
# Check that master is checked out | |
if [[ $(git rev-parse --abbrev-ref HEAD) != "master" ]]; then | |
echo "Error: You must be on master branch" | |
exit 1 | |
fi | |
if [[ $REPLY =~ ^[Yy]$ ]]; then | |
echo "Creating release v$current_version" | |
git add $PROJECT_FILE | |
git commit -m "Bump version from $current_version to $current_version" | |
git tag -a "v$current_version" -m "v$current_version" | |
git push origin "v$current_version" | |
fi | |
} | |
# Check if the version file exists | |
if [ ! -f $PROJECT_FILE ]; then | |
echo "Error: $PROJECT_FILE not found." | |
exit 1 | |
fi | |
current_version=$(grep -oP '^version = "\K[^"]+' pyproject.toml) | |
major_version=$(echo "$current_version" | cut -d '.' -f 1) | |
minor_version=$(echo "$current_version" | cut -d '.' -f 2) | |
patch_version=$(echo "$current_version" | cut -d '.' -f 3) | |
latest_tag=$(git describe --tags --abbrev=0 2>/dev/null || true) | |
current_tagged_version=$(echo "$latest_tag" | cut -d 'v' -f 2) | |
if [ $# -eq 0 ]; then | |
if [ "$current_tagged_version" == "$current_version" ]; then | |
echo "$current_version" "(Released)" | |
else | |
echo "$current_version" "(Not released)" | |
fi | |
exit 0 | |
fi | |
case "$1" in | |
major) | |
major_version=$((major_version + 1)) | |
minor_version=0 | |
patch_version=0 | |
;; | |
minor) | |
minor_version=$((minor_version + 1)) | |
patch_version=0 | |
;; | |
patch) | |
patch_version=$((patch_version + 1)) | |
;; | |
--help) | |
echo "Usage:" | |
echo "$0 # Show current version" | |
echo "$0 major # Increase major version" | |
echo "$0 minor # Increase minor version" | |
echo "$0 patch # Increase patch version" | |
echo "$0 --release # Create a release for the current version" | |
echo "" | |
exit 0 | |
;; | |
--release) | |
if [ "$current_tagged_version" == "$current_version" ]; then | |
echo "Error: Version $current_version already released" | |
exit 1 | |
fi | |
create_release | |
exit 0 | |
;; | |
*) | |
echo "Error: Invalid argument" | |
help | |
exit 1 | |
esac | |
new_version="$major_version.$minor_version.$patch_version" | |
sed -i "s/^version = \".*\"/version = \"$new_version\"/" $PROJECT_FILE | |
echo "Bumped version from $current_version to $new_version" | |
create_release |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment