Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 68 additions & 14 deletions .github/scripts/bump_tag.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@ usage() {
cat <<'EOF'
Usage: .github/scripts/bump_tag.sh [--dry-run] [--push] [--verbose]

Creates a new semver tag based on the Gradle project version and existing tags.
Uses Gradle major/minor and bumps the patch for matching tags.
Creates a new semver tag based on existing tags and commit messages.

Version bump logic:
- MAJOR: If Gradle major version is 1 ahead of latest tag, bump major and reset minor/patch to 0.
Fails if Gradle major is 2+ ahead or behind the latest tag.
- MINOR: If commit message contains "new-feature", bump minor and reset patch to 0.
- PATCH: Otherwise, bump patch version.

Options:
--dry-run Print the tag that would be created, but do not create it.
Expand Down Expand Up @@ -40,26 +45,75 @@ if [[ ! "$base_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
exit 1
fi

IFS='.' read -r base_major base_minor base_patch <<<"$base_version"
matching_tag=$(git tag --list "v${base_major}.${base_minor}.[0-9]*" | LC_ALL=C sort -V | tail -n 1)
IFS='.' read -r gradle_major _ _ <<<"$base_version"

# Check if last commit message contains "new-feature"
COMMIT_MSG=$(git log -1 --format=%s)
BUMP_MINOR=false
if [[ "$COMMIT_MSG" == *"new-feature"* ]]; then
BUMP_MINOR=true
fi

# Find the latest tag
latest_tag=$(git tag --list "v[0-9]*.[0-9]*.[0-9]*" | LC_ALL=C sort -V | tail -n 1)

if [[ -n "$latest_tag" ]]; then
latest_version=${latest_tag#v}
IFS='.' read -r latest_major latest_minor latest_patch <<<"$latest_version"

major_diff=$((gradle_major - latest_major))

if [[ -n "$matching_tag" ]]; then
matching_version=${matching_tag#v}
IFS='.' read -r _ _ matching_patch <<<"$matching_version"
patch=$((matching_patch + 1))
if [[ $major_diff -ge 2 ]]; then
echo "Version from build.gradle.kts ($gradle_major) is 2 or more ahead of latest tag major version ($latest_major)"
exit 1
elif [[ $major_diff -eq 1 ]]; then
# Bump to new major version, reset minor and patch
major=$gradle_major
minor=0
patch=0
elif [[ $major_diff -lt 0 ]]; then
echo "Error: Gradle major version ($gradle_major) is behind latest tag major version ($latest_major)"
exit 1
elif $BUMP_MINOR; then
# Bump minor version, reset patch to 0
major=$latest_major
minor=$((latest_minor + 1))
patch=0
else
# Bump patch version
major=$latest_major
minor=$latest_minor
patch=$((latest_patch + 1))
fi
else
patch=0
# No existing tags, start fresh
major=$gradle_major
if $BUMP_MINOR; then
minor=1
patch=0
else
minor=0
patch=0
fi
fi

new_version="${base_major}.${base_minor}.${patch}"
new_version="${major}.${minor}.${patch}"
new_tag="v${new_version}"

if $VERBOSE; then
echo "Gradle version: ${base_version}"
if [[ -n "$matching_tag" ]]; then
echo "Matching tag: ${matching_tag}"
echo "Gradle major version: ${gradle_major}"
echo "Commit message: ${COMMIT_MSG}"
if [[ -n "$latest_tag" ]]; then
echo "Latest tag: ${latest_tag} (major: ${latest_major})"
else
echo "Latest tag: (none)"
fi
if [[ -n "$latest_tag" ]] && [[ $major_diff -eq 1 ]]; then
echo "Bump type: MAJOR (gradle version ahead)"
elif $BUMP_MINOR; then
echo "Bump type: MINOR (new-feature)"
else
echo "Matching tag: (none)"
echo "Bump type: PATCH"
fi
echo "Next tag: ${new_tag}"
fi
Expand Down