Skip to content

fix: deadlock in proactive refresh and concurrent refresh race #22

fix: deadlock in proactive refresh and concurrent refresh race

fix: deadlock in proactive refresh and concurrent refresh race #22

Workflow file for this run

name: Release
on:
push:
tags:
- 'v*.*.*'
- 'v*.*.*-*' # Match pre-release tags (e.g., v2.0.0-beta.1)
permissions:
contents: write
jobs:
validate:
name: Validate Release
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get-version.outputs.version }}
base_version: ${{ steps.base-version.outputs.base }}
prerelease: ${{ steps.detect-prerelease.outputs.prerelease }}
steps:
- uses: actions/checkout@v6
- name: Get version from tag
id: get-version
run: |
TAG=${GITHUB_REF#refs/tags/v}
echo "version=$TAG" >> $GITHUB_OUTPUT
echo "Tag version: $TAG"
- name: Get base version (strip pre-release suffix)
id: base-version
run: |
TAG_VERSION="${{ steps.get-version.outputs.version }}"
BASE_VERSION=$(echo "$TAG_VERSION" | sed 's/-.*//')
echo "base=$BASE_VERSION" >> $GITHUB_OUTPUT
echo "Base version: $BASE_VERSION (from tag: $TAG_VERSION)"
- name: Validate manifest version
run: |
MANIFEST_VERSION=$(jq -r '.version' custom_components/melcloudhome/manifest.json)
BASE_VERSION="${{ steps.base-version.outputs.base }}"
echo "Manifest version: $MANIFEST_VERSION"
echo "Expected version: $BASE_VERSION"
if [ "$MANIFEST_VERSION" != "$BASE_VERSION" ]; then
echo "❌ Version mismatch!"
echo "Manifest version ($MANIFEST_VERSION) does not match expected ($BASE_VERSION)"
exit 1
fi
echo "✅ Versions match!"
- name: Validate CHANGELOG entry
run: |
BASE_VERSION="${{ steps.base-version.outputs.base }}"
if ! grep -q "\[$BASE_VERSION\]" CHANGELOG.md; then
echo "❌ No CHANGELOG entry found for version $BASE_VERSION"
exit 1
fi
echo "✅ CHANGELOG entry found!"
- name: Validate README "What's New" version
run: |
BASE_VERSION="${{ steps.base-version.outputs.base }}"
README_VERSION=$(grep "## What's New in v" README.md | sed -n 's/## What'\''s New in v\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p')
echo "README 'What's New' version: $README_VERSION"
echo "Expected version: $BASE_VERSION"
if [ -z "$README_VERSION" ]; then
echo "❌ No 'What's New' version found in README.md"
exit 1
fi
if [ "$README_VERSION" != "$BASE_VERSION" ]; then
echo "❌ Version mismatch!"
echo "README 'What's New' version ($README_VERSION) does not match expected ($BASE_VERSION)"
exit 1
fi
echo "✅ README version matches!"
- name: Detect pre-release
id: detect-prerelease
run: |
TAG_VERSION="${{ steps.get-version.outputs.version }}"
if echo "$TAG_VERSION" | grep -qE '\-(alpha|beta|rc)\.'; then
echo "prerelease=true" >> $GITHUB_OUTPUT
echo "✅ Pre-release detected: $TAG_VERSION"
else
echo "prerelease=false" >> $GITHUB_OUTPUT
echo "✅ Stable release detected: $TAG_VERSION"
fi
test:
name: Run Full Test Suite
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync
- name: Format check
run: make format-check
- name: Lint
run: make lint
- name: Type check
run: make type-check
- name: Run all tests (identical to local)
run: make test
release:
name: Create GitHub Release
needs: [validate, test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Extract release notes
id: extract-notes
run: |
VERSION="${{ needs.validate.outputs.base_version }}"
# Extract section between current version and next version heading
# Using sed for better portability across awk implementations
sed -n "/^## \[$VERSION\]/,/^## \[/{
/^## \[$VERSION\]/d
/^## \[/q
p
}" CHANGELOG.md > release_notes.txt
# Clean up empty lines at start/end
sed -i '/./,$!d' release_notes.txt
sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' release_notes.txt
echo "Release notes extracted:"
cat release_notes.txt
- name: Create GitHub Release
uses: softprops/action-gh-release@v3.0.0
with:
body_path: release_notes.txt
draft: false
prerelease: ${{ needs.validate.outputs.prerelease == 'true' }}
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Release summary
run: |
if [ "${{ needs.validate.outputs.prerelease }}" == "true" ]; then
RELEASE_TYPE="Pre-release"
else
RELEASE_TYPE="Stable Release"
fi
echo "## 🚀 $RELEASE_TYPE ${{ needs.validate.outputs.version }} Published!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Release Notes" >> $GITHUB_STEP_SUMMARY
cat release_notes.txt >> $GITHUB_STEP_SUMMARY