From 461406c9508d9f5faf4c282ad3ae277921305b82 Mon Sep 17 00:00:00 2001 From: Tor Egil Jacobsen Date: Sat, 21 Feb 2026 12:44:30 +0100 Subject: [PATCH] #24: new-feature: bump semver according to git or gradle build --- .github/scripts/bump_tag.sh | 82 ++++++++++++++++++++++++++++++------- 1 file changed, 68 insertions(+), 14 deletions(-) diff --git a/.github/scripts/bump_tag.sh b/.github/scripts/bump_tag.sh index 2d66420..b93a9e8 100755 --- a/.github/scripts/bump_tag.sh +++ b/.github/scripts/bump_tag.sh @@ -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. @@ -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