@@ -126,28 +126,80 @@ jobs:
126126 # -------------------------------------------------
127127 # Release safety checks
128128 # -------------------------------------------------
129- - name : Abort if release exists
129+ - name : Check if GitHub release already exists
130130 env :
131131 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
132132 run : |
133133 set -euo pipefail
134134 if gh release view "$TAG" >/dev/null 2>&1; then
135- echo "ERROR: Release $TAG already exists."
136- exit 1
135+ echo "RELEASE_EXISTS=true" >> "$GITHUB_ENV"
136+ echo "RELEASE_IS_DRAFT=$(gh release view "$TAG" --json isDraft -q '.isDraft')" >> "$GITHUB_ENV"
137+ else
138+ echo "RELEASE_EXISTS=false" >> "$GITHUB_ENV"
137139 fi
138140
139- - name : Detect prerelease
141+ - name : Abort if release already published
142+ if : env.RELEASE_EXISTS == 'true' && env.RELEASE_IS_DRAFT != 'true'
143+ run : |
144+ echo "ERROR: Release $TAG already exists and is published."
145+ echo "Refusing to modify an immutable release."
146+ exit 1
147+
148+ - name : Detect pre-release
140149 run : |
150+ set -euo pipefail
141151 if [[ "$TAG" =~ -(alpha|beta|rc) ]]; then
152+ echo "IS_PRERELEASE=true" >> "$GITHUB_ENV"
153+ else
154+ echo "IS_PRERELEASE=false" >> "$GITHUB_ENV"
155+ fi
156+
157+ - name : Set prerelease flag
158+ run : |
159+ if [[ "$IS_PRERELEASE" == "true" ]]; then
142160 echo "PRERELEASE=--prerelease" >> "$GITHUB_ENV"
143161 else
144162 echo "PRERELEASE=" >> "$GITHUB_ENV"
145163 fi
164+ - name : Detect release type
165+ run : |
166+ set -euo pipefail
167+ VERSION="${TAG#v}"
168+ IFS='.-' read -r MAJOR MINOR PATCH _ <<< "$VERSION"
169+
170+ echo "MAJOR=$MAJOR" >> "$GITHUB_ENV"
171+ echo "MINOR=$MINOR" >> "$GITHUB_ENV"
172+ echo "PATCH=$PATCH" >> "$GITHUB_ENV"
173+
174+ if [[ "$PATCH" == "0" && "$MINOR" == "0" ]]; then
175+ echo "RELEASE_TYPE=major" >> "$GITHUB_ENV"
176+ elif [[ "$PATCH" == "0" ]]; then
177+ echo "RELEASE_TYPE=minor" >> "$GITHUB_ENV"
178+ else
179+ echo "RELEASE_TYPE=patch" >> "$GITHUB_ENV"
180+ fi
181+
182+ - name : Compute notes start tag
183+ if : env.IS_PRERELEASE != 'true'
184+ run : |
185+ set -euo pipefail
186+ {
187+ case "$RELEASE_TYPE" in
188+ major) echo "START_TAG=v${MAJOR}.0.0" ;;
189+ minor) echo "START_TAG=v${MAJOR}.${MINOR}.0" ;;
190+ patch)
191+ if [[ "$PATCH" -gt 0 ]]; then
192+ echo "START_TAG=v${MAJOR}.${MINOR}.$((PATCH-1))"
193+ fi
194+ ;;
195+ esac
196+ } >> "$GITHUB_ENV"
146197
147198 # -------------------------------------------------
148199 # Create & publish GitHub release
149200 # -------------------------------------------------
150201 - name : Create GitHub release (draft)
202+ if : env.RELEASE_EXISTS != 'true'
151203 env :
152204 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
153205 run : |
@@ -157,25 +209,11 @@ jobs:
157209 --title "$TAG" \
158210 --generate-notes
159211
160- - name : Upload release assets
161- env :
162- GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
163- run : |
164- gh release upload "$TAG" \
165- digipin-swift-${TAG}-spm-sbom.json \
166- digipin-swift-${TAG}.doccarchive.zip
167-
168- - name : Publish GitHub release
169- if : env.TEST_MODE != 'true'
170- env :
171- GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
172- run : gh release edit "$TAG" --draft=false
173-
174212 # -------------------------------------------------
175213 # Generate DocC (static, latest only)
176214 # -------------------------------------------------
177215 - name : Generate DocC (static, latest)
178- if : env.TEST_MODE != 'true' && env.PRERELEASE == ' '
216+ if : env.TEST_MODE != 'true' && env.IS_PRERELEASE != 'true '
179217 run : |
180218 set -euo pipefail
181219
@@ -196,12 +234,12 @@ jobs:
196234 # Publish latest docs to gh-pages
197235 # -------------------------------------------------
198236 - name : Publish docs to gh-pages
199- if : env.TEST_MODE != 'true' && env.PRERELEASE == ' '
237+ if : env.TEST_MODE != 'true' && env.IS_PRERELEASE != 'true '
200238 env :
201239 GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
202240 run : |
203241 set -euo pipefail
204-
242+ rm -rf Digipin.doccarchive site
205243 git config user.name "github-actions[bot]"
206244 git config user.email "github-actions[bot]@users.noreply.github.com"
207245
@@ -233,3 +271,17 @@ jobs:
233271 Run: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
234272
235273 git push origin gh-pages
274+
275+ - name : Upload release assets
276+ env :
277+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
278+ run : |
279+ gh release upload "$TAG" \
280+ digipin-swift-${TAG}-spm-sbom.json \
281+ digipin-swift-${TAG}.doccarchive.zip
282+
283+ - name : Publish GitHub release
284+ if : env.TEST_MODE != 'true'
285+ env :
286+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
287+ run : gh release edit "$TAG" --draft=false
0 commit comments