Skip to content

Commit 6a9507d

Browse files
committed
chore: fix release script for prereleases
1 parent cea6375 commit 6a9507d

1 file changed

Lines changed: 51 additions & 10 deletions

File tree

.github/workflows/release.yml

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ on:
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:
@@ -26,7 +28,7 @@ on:
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

Comments
 (0)