diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml
index 857a44c..6ecba43 100644
--- a/.gitea/workflows/release.yml
+++ b/.gitea/workflows/release.yml
@@ -15,17 +15,12 @@ jobs:
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- - name: Setup PowerShell
- run: |
- sudo apk update
- sudo apk add powershell
- name: Determine version
id: version
- run: pwsh -File scripts/determine-version.ps1 -Branch main | tee -a $env:GITHUB_OUTPUT
- shell: pwsh
+ run: ./scripts/determine-version.sh main | tee -a $GITHUB_OUTPUT
- name: Update version in csproj
if: steps.version.outputs.VERSION
- run: pwsh -File scripts/update-version.ps1 -Version "${{ steps.version.outputs.VERSION }}"
+ run: ./scripts/update-version.sh "${{ steps.version.outputs.VERSION }}"
- name: Create commit
if: steps.version.outputs.VERSION
run: |
diff --git a/scripts/determine-version.sh b/scripts/determine-version.sh
new file mode 100644
index 0000000..4e1d996
--- /dev/null
+++ b/scripts/determine-version.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+branch="${1:-main}"
+
+commits=$(git log "$branch..HEAD" --format="%s")
+major=0
+minor=0
+patch=0
+
+while IFS= read -r message; do
+ if [[ -n "$message" ]] && [[ "$message" =~ " BREAKING CHANGE|!:" ]]; then
+ major=1
+ elif [[ -n "$message" ]] && [[ "$message" =~ ^feat(\(.*\))?: ]]; then
+ minor=1
+ elif [[ -n "$message" ]] && [[ "$message" =~ ^fix(\(.*\))?: ]]; then
+ patch=1
+ fi
+done <<< "$commits"
+
+if [[ "$major" -eq 1 ]]; then
+ minor=0
+ patch=0
+elif [[ "$minor" -eq 1 ]]; then
+ patch=0
+elif [[ "$patch" -eq 0 ]] && [[ -n "$commits" ]]; then
+ patch=1
+fi
+
+currentVersion="0.0.0"
+tag=$(git describe --tags --abbrev=0 2>/dev/null)
+hasExistingTag=false
+
+if [[ -n "$tag" ]]; then
+ hasExistingTag=true
+ currentVersion="${tag#v}"
+fi
+
+IFS='.' read -r majorCurrent minorCurrent patchCurrent <<< "$currentVersion"
+
+majorNew=$((majorCurrent + major))
+
+if [[ "$major" -eq 1 ]]; then
+ minorNew=0
+else
+ minorNew=$((minorCurrent + minor))
+fi
+
+if [[ "$major" -eq 1 ]] || [[ "$minor" -eq 1 ]]; then
+ patchNew=0
+else
+ patchNew=$((patchCurrent + patch))
+fi
+
+if [[ "$majorNew" -eq "$majorCurrent" ]] && [[ "$minorNew" -eq "$minorCurrent" ]] && [[ "$patchNew" -eq "$patchCurrent" ]]; then
+ if [[ "$hasExistingTag" == "false" ]]; then
+ version="0.0.0"
+ echo "VERSION=$version"
+ echo "First release: publishing version 0.0.0"
+ else
+ echo "No version bump needed, skipping release"
+ exit 0
+ fi
+else
+ version="$majorNew.$minorNew.$patchNew"
+ echo "VERSION=$version"
+fi
diff --git a/scripts/update-version.sh b/scripts/update-version.sh
new file mode 100644
index 0000000..a71067e
--- /dev/null
+++ b/scripts/update-version.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+version="${1:-}"
+csprojPath="${2:-src/StevanFreeborn.Results/StevanFreeborn.Results.csproj}"
+
+if [[ -z "$version" ]]; then
+ echo "Error: Version is required"
+ exit 1
+fi
+
+content=$(cat "$csprojPath")
+
+if [[ "$content" =~ \.*?\ ]]; then
+ content=$(echo "$content" | sed "s|.*|$version|")
+elif [[ "$content" =~ \ ]]; then
+ content=$(echo "$content" | sed "s||\\n $version|")
+fi
+
+echo "$content" > "$csprojPath"