1111 - patch
1212 - minor
1313 - major
14- - prerelease
14+ - prepatch
15+ - preminor
16+ - premajor
1517 prerelease_type :
16- description : ' Pre-release type (only used if version is "prerelease" )'
18+ description : ' Pre-release type (used when version is prepatch/preminor/premajor )'
1719 type : choice
1820 default : " "
1921 options :
2628 type : string
2729 default : " "
2830 confirm_major :
29- description : " Type RELEASE MAJOR to confirm a major release"
31+ description : " Type RELEASE MAJOR to confirm a major or premajor release"
3032 required : false
3133 default : " "
3234
@@ -52,10 +54,10 @@ jobs:
5254 fi
5355
5456 - name : Confirm major release
55- if : ${{ inputs.version == 'major' && inputs.dry_run == false }}
57+ if : ${{ inputs.version == 'major' || inputs.version == 'premajor' }}
5658 run : |
5759 if [ "${{ inputs.confirm_major }}" != "RELEASE MAJOR" ]; then
58- echo "❌ For major releases, set confirm_major to RELEASE MAJOR"
60+ echo "❌ For major/premajor releases, set confirm_major to RELEASE MAJOR"
5961 exit 1
6062 fi
6163
@@ -108,12 +110,50 @@ jobs:
108110 # Parse version components
109111 IFS='.' read -r major minor patch <<< "$base_version"
110112
111- if [ "$version_type" = "prerelease" ]; then
113+ if echo "$current_version" | grep -qE '(a|b|rc)[0-9]+$'; then
114+ current_is_prerelease="true"
115+ else
116+ current_is_prerelease="false"
117+ fi
118+
119+ if [ "$version_type" = "premajor" ] || [ "$version_type" = "preminor" ] || [ "$version_type" = "prepatch" ]; then
112120 if [ -z "$prerelease_type" ]; then
113- echo "❌ Error: prerelease_type must be specified when version is ' prerelease' "
121+ echo "❌ Error: prerelease_type must be specified when version is a prerelease variant "
114122 exit 1
115123 fi
116124
125+ # Determine the prerelease base version target
126+ case "$version_type" in
127+ premajor)
128+ if [ "$current_is_prerelease" = "true" ] && [ "$minor" -eq 0 ] && [ "$patch" -eq 0 ]; then
129+ target_major=$major
130+ else
131+ target_major=$((major + 1))
132+ fi
133+ target_minor=0
134+ target_patch=0
135+ ;;
136+ preminor)
137+ target_major=$major
138+ if [ "$current_is_prerelease" = "true" ] && [ "$patch" -eq 0 ] && [ "$minor" -gt 0 ]; then
139+ target_minor=$minor
140+ else
141+ target_minor=$((minor + 1))
142+ fi
143+ target_patch=0
144+ ;;
145+ prepatch)
146+ target_major=$major
147+ target_minor=$minor
148+ if [ "$current_is_prerelease" = "true" ] && [ "$patch" -gt 0 ]; then
149+ target_patch=$patch
150+ else
151+ target_patch=$((patch + 1))
152+ fi
153+ ;;
154+ esac
155+ target_base_version="${target_major}.${target_minor}.${target_patch}"
156+
117157 # Map prerelease type to Python suffix
118158 case "$prerelease_type" in
119159 alpha) suffix="a" ;;
@@ -126,15 +166,16 @@ jobs:
126166 pre_num="$prerelease_increment"
127167 else
128168 # Check if current version is same type of prerelease, if so increment
129- if echo "$current_version" | grep -qE "${suffix}[0-9]+$"; then
130- current_pre_num=$(echo "$current_version" | sed -E "s/.*${suffix}([0-9]+)$/\1/")
169+ escaped_target_base_version=$(echo "$target_base_version" | sed 's/\./\\./g')
170+ if echo "$current_version" | grep -qE "^${escaped_target_base_version}${suffix}[0-9]+$"; then
171+ current_pre_num=$(echo "$current_version" | sed -E "s/^${escaped_target_base_version}${suffix}([0-9]+)$/\1/")
131172 pre_num=$((current_pre_num + 1))
132173 else
133174 pre_num=1
134175 fi
135176 fi
136177
137- new_version="${base_version }${suffix}${pre_num}"
178+ new_version="${target_base_version }${suffix}${pre_num}"
138179 is_prerelease="true"
139180 else
140181 # Standard version bump
0 commit comments