33
44# Script to create a major/minor release candidate (RC)
55# Always creates RC from the tip of main branch
6- # Usage: create_major_minor_rc.sh <target_version>
7- # Example: create_major_minor_rc.sh 1.3.0
6+ # Checks for breaking changes and bumps major version if needed
7+ # The version is automatically determined from main branch HEAD
8+ # Usage: create_major_minor_rc.sh
9+ # Example: create_major_minor_rc.sh
810
9- TARGET_VERSION=${1:? " Error: target version required (e.g., 1.3.0)" }
10- TAG_PREFIX=${2:- " v" }
11+ TAG_PREFIX=${1:- " v" }
1112
1213readonly SELF_DIR=$( cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd )
1314
14- echo " Creating major/minor RC for version ${TARGET_VERSION} from main HEAD"
15-
16- # Parse major.minor from target version
17- MAJOR=$( echo " ${TARGET_VERSION} " | cut -d. -f1)
18- MINOR=$( echo " ${TARGET_VERSION} " | cut -d. -f2)
19- RELEASE_BRANCH=" release/v${MAJOR} .${MINOR} "
20-
21- echo " Will create release branch: ${RELEASE_BRANCH} "
22-
23- # Check if main is at beta.0, bump to beta.1 first
2415git checkout main
2516MAIN_VERSION=$( grep ' ^version = ' Cargo.toml | head -n1 | cut -d' "' -f2)
2617echo " Main branch current version: ${MAIN_VERSION} "
2718
28- if [[ " ${MAIN_VERSION} " =~ -b eta\. 0$ ]]; then
29- echo " Main is at beta.0, bumping to beta.1 first"
30- bump-my-version bump -vv prerelease_num
19+ # Extract the base version from main (remove beta suffix if present)
20+ if [[ " ${MAIN_VERSION} " =~ ^([0-9]+)\. ([0-9]+)\. ([0-9]+)(-beta\. ([0-9]+))? $ ]]; then
21+ CURR_MAJOR=" ${BASH_REMATCH[1]} "
22+ CURR_MINOR=" ${BASH_REMATCH[2]} "
23+ CURR_PATCH=" ${BASH_REMATCH[3]} "
24+ BASE_VERSION=" ${CURR_MAJOR} .${CURR_MINOR} .${CURR_PATCH} "
25+ else
26+ echo " ERROR: Cannot parse version from main branch: ${MAIN_VERSION} "
27+ exit 1
28+ fi
29+
30+ echo " Current base version on main: ${BASE_VERSION} "
31+
32+ # Check for existing release-root tag to find comparison base
33+ CURR_RELEASE_ROOT_TAG=" release-root/${BASE_VERSION} -beta.N"
34+
35+ if git rev-parse " ${CURR_RELEASE_ROOT_TAG} " > /dev/null 2>&1 ; then
36+ echo " Found release root tag: ${CURR_RELEASE_ROOT_TAG} "
37+ COMPARE_TAG=" ${CURR_RELEASE_ROOT_TAG} "
38+ COMPARE_COMMIT=$( git rev-parse " ${CURR_RELEASE_ROOT_TAG} " )
39+ echo " Will compare against: ${COMPARE_TAG} (commit: ${COMPARE_COMMIT} )"
40+ else
41+ echo " No release root tag found for current version series"
42+ COMPARE_TAG=" "
43+ fi
3144
32- git add -A
33- git commit -m " chore: bump to beta.1 for preview release"
45+ # Check for breaking changes
46+ BREAKING_CHANGES=" false"
47+ if [ -n " ${COMPARE_TAG} " ]; then
48+ if [ -x " ${SELF_DIR} /check_breaking_changes.py" ]; then
49+ if python3 " ${SELF_DIR} /check_breaking_changes.py" --detect-only " ${COMPARE_TAG} " " HEAD" ; then
50+ echo " No breaking changes detected"
51+ BREAKING_CHANGES=" false"
52+ else
53+ echo " Breaking changes detected"
54+ BREAKING_CHANGES=" true"
55+ fi
56+ fi
3457fi
3558
59+ # Determine RC version based on breaking changes
60+ if [ " ${BREAKING_CHANGES} " = " true" ]; then
61+ # If breaking changes, check if we need to bump major
62+ # Extract the base RC version from the release-root tag message
63+ # This is the RC version we're comparing against (stays constant across major bumps)
64+ TAG_MESSAGE=$( git tag -l --format=' %(contents)' " ${CURR_RELEASE_ROOT_TAG} " )
65+ BASE_RC_VERSION=$( echo " ${TAG_MESSAGE} " | head -n1 | sed ' s/Base: //' )
66+ BASE_RC_MAJOR=$( echo " ${BASE_RC_VERSION} " | cut -d. -f1 | sed ' s/^v//' )
67+
68+ echo " Base RC version: ${BASE_RC_VERSION} (major: ${BASE_RC_MAJOR} )"
69+
70+ if [ " ${CURR_MAJOR} " -gt " ${BASE_RC_MAJOR} " ]; then
71+ echo " Major version already bumped from ${BASE_RC_MAJOR} to ${CURR_MAJOR} "
72+ RC_VERSION=" ${BASE_VERSION} -rc.0"
73+ else
74+ echo " Breaking changes require major version bump"
75+ RC_MAJOR=$(( CURR_MAJOR + 1 ))
76+ RC_VERSION=" ${RC_MAJOR} .0.0-rc.0"
77+ fi
78+ else
79+ # No breaking changes, use current base version
80+ RC_VERSION=" ${BASE_VERSION} -rc.0"
81+ fi
82+
83+ echo " Creating RC version: ${RC_VERSION} "
84+
85+ # Parse RC version for release branch
86+ RC_MAJOR=$( echo " ${RC_VERSION} " | cut -d. -f1)
87+ RC_MINOR=$( echo " ${RC_VERSION} " | cut -d. -f2)
88+ RELEASE_BRANCH=" release/v${RC_MAJOR} .${RC_MINOR} "
89+
90+ echo " Will create release branch: ${RELEASE_BRANCH} "
91+
3692# Create release branch from main HEAD
3793echo " Creating release branch ${RELEASE_BRANCH} from main HEAD"
3894git checkout -b " ${RELEASE_BRANCH} "
3995
40- # Set version to target-rc.1
41- RC_VERSION=" ${TARGET_VERSION} -rc.1"
96+ # Set version to RC version
4297echo " Setting version to ${RC_VERSION} "
43-
4498bump-my-version bump -vv --new-version " ${RC_VERSION} " --no-tag patch
4599
46100# Commit the RC version
@@ -58,32 +112,13 @@ echo "Successfully created RC tag: ${RC_TAG} on branch ${RELEASE_BRANCH}"
58112echo " Bumping main to next version beta.0"
59113git checkout main
60114
61- # Get current version on main
62- CURRENT_MAIN_VERSION=$( grep ' ^version = ' Cargo.toml | head -n1 | cut -d' "' -f2)
63- echo " Current main version: ${CURRENT_MAIN_VERSION} "
64-
65- # Parse current version
66- CURR_MAJOR=$( echo " ${CURRENT_MAIN_VERSION} " | cut -d. -f1 | sed ' s/-beta.*//' )
67- CURR_MINOR=$( echo " ${CURRENT_MAIN_VERSION} " | cut -d. -f2)
68- CURR_PATCH=$( echo " ${CURRENT_MAIN_VERSION} " | cut -d. -f3 | cut -d- -f1)
69-
70- # Determine next version - just increment based on what we have
71- # Breaking change detection will happen during beta publish
72- if [ " ${CURR_PATCH} " != " 0" ]; then
73- # If on a patch version, bump to next minor
74- NEXT_MINOR=$(( CURR_MINOR + 1 ))
75- NEXT_VERSION=" ${CURR_MAJOR} .${NEXT_MINOR} .0-beta.0"
76- elif [ " ${CURR_MINOR} " -gt " 0" ]; then
77- # On minor version, bump to next minor
78- NEXT_MINOR=$(( CURR_MINOR + 1 ))
79- NEXT_VERSION=" ${CURR_MAJOR} .${NEXT_MINOR} .0-beta.0"
80- else
81- # On major.0.0, bump to next major
82- NEXT_MAJOR=$(( CURR_MAJOR + 1 ))
83- NEXT_VERSION=" ${NEXT_MAJOR} .0.0-beta.0"
84- fi
115+ # Determine next version for main based on RC version
116+ # Always bump minor from the RC version
117+ NEXT_MAJOR=" ${RC_MAJOR} "
118+ NEXT_MINOR=$(( RC_MINOR + 1 ))
119+ NEXT_VERSION=" ${NEXT_MAJOR} .${NEXT_MINOR} .0-beta.0"
85120
86- echo " Bumping main to ${NEXT_VERSION} (unreleased, will be adjusted during beta publish )"
121+ echo " Bumping main to ${NEXT_VERSION} (unreleased)"
87122
88123bump-my-version bump -vv --new-version " ${NEXT_VERSION} " --no-tag patch
89124
0 commit comments