@@ -13,45 +13,65 @@ jobs:
1313 with :
1414 fetch-depth : 0 # Important to fetch all tags
1515
16- - name : Get Latest Tag
17- id : get_latest_tag
16+ - name : Get Version from mod.json
17+ id : get_version
1818 run : |
19- LATEST_TAG=$(git describe --abbrev=0 --tags 2>/dev/null || echo "")
20- if [[ -z "$LATEST_TAG" ]]; then
21- echo "No tags found. This seems to be the first release."
22- echo "PREVIOUS_VERSION=0.0.0" >> $GITHUB_OUTPUT # Set a default
23- echo "IS_INITIAL_RELEASE=true" >> $GITHUB_OUTPUT
24- else
25- PREVIOUS_VERSION=$(echo $LATEST_TAG | sed 's/^v//')
26- echo "PREVIOUS_VERSION=$PREVIOUS_VERSION" >> $GITHUB_OUTPUT
27- echo "IS_INITIAL_RELEASE=false" >> $GITHUB_OUTPUT
28- fi
19+ VERSION=$(jq -r .version mod.json)
20+ echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
2921
30- - name : Generate Release Notes
31- id : generate_release_notes
22+ - name : Calculate Release Version and Tag
23+ id : calculate_release_version
3224 run : |
33- PREVIOUS_TAG="v${{ steps.get_latest_tag.outputs.PREVIOUS_VERSION }}"
34- IS_INITIAL_RELEASE="${{ steps.get_latest_tag.outputs.IS_INITIAL_RELEASE }}"
25+ VERSION="${{ steps.get_version.outputs.VERSION }}"
26+
27+ # Calculate the release version (one less than current version in mod.json)
28+ # This uses awk to handle decimal subtraction correctly
29+ RELEASE_VERSION=$(echo "$VERSION - 0.001" | awk '{printf "%.3f", $1}') # Adjust precision as needed
30+ RELEASE_TAG="v$RELEASE_VERSION"
31+
32+ echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_OUTPUT
33+ echo "RELEASE_TAG=$RELEASE_TAG" >> $GITHUB_OUTPUT
3534
36- if [[ "$IS_INITIAL_RELEASE" == "true" ]]; then
37- echo "No previous tag found. Creating initial release notes."
38- RELEASE_NOTES="Initial release."
35+ - name : Check if Tag Exists
36+ id : check_tag_exists
37+ run : |
38+ RELEASE_TAG="${{ steps.calculate_release_version.outputs.RELEASE_TAG }}"
39+ git fetch --tags
40+ if git rev-parse --verify "refs/tags/$RELEASE_TAG" >/dev/null 2>&1; then
41+ echo "TAG_EXISTS=true" >> $GITHUB_OUTPUT
42+ echo "Tag $RELEASE_TAG already exists. Skipping release creation."
3943 else
40- echo "Previous tag is $PREVIOUS_TAG"
41- RELEASE_NOTES=$(git log $PREVIOUS_TAG..HEAD --pretty=format:"- %s")
44+ echo "TAG_EXISTS=false" >> $GITHUB_OUTPUT
45+ echo "Tag $RELEASE_TAG does not exist. Proceeding with release creation."
4246 fi
4347
48+ - name : Generate Release Notes
49+ id : generate_release_notes
50+ if : steps.check_tag_exists.outputs.TAG_EXISTS == 'false'
51+ run : |
52+ RELEASE_TAG="${{ steps.calculate_release_version.outputs.RELEASE_TAG }}"
53+ # Using git log to get commits since the calculated tag
54+ RELEASE_NOTES=$(git log $RELEASE_TAG..HEAD --pretty=format:"- %s")
4455 echo "RELEASE_NOTES<<EOF" >> $GITHUB_OUTPUT
4556 echo "$RELEASE_NOTES" >> $GITHUB_OUTPUT
4657 echo "EOF" >> $GITHUB_OUTPUT
4758
4859 - name : Create Release
4960 uses : actions/create-release@v1
61+ if : steps.check_tag_exists.outputs.TAG_EXISTS == 'false'
5062 env :
5163 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
5264 with :
53- tag_name : v ${{ steps.get_latest_tag .outputs.PREVIOUS_VERSION }}
54- release_name : Release v ${{ steps.get_latest_tag .outputs.PREVIOUS_VERSION }}
65+ tag_name : ${{ steps.calculate_release_version .outputs.RELEASE_TAG }}
66+ release_name : Release ${{ steps.calculate_release_version .outputs.RELEASE_TAG }}
5567 body : ${{ steps.generate_release_notes.outputs.RELEASE_NOTES }}
5668 draft : false
5769 prerelease : false
70+
71+ - name : Create Tag (if it doesn't exist)
72+ if : steps.check_tag_exists.outputs.TAG_EXISTS == 'false'
73+ run : |
74+ RELEASE_TAG="${{ steps.calculate_release_version.outputs.RELEASE_TAG }}"
75+ git tag $RELEASE_TAG
76+ git push origin $RELEASE_TAG
77+ echo "Created tag $RELEASE_TAG"
0 commit comments