Skip to content
Merged
78 changes: 78 additions & 0 deletions .github/workflows/cleanup-preview-releases.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Cleanup Preview Releases

on:
pull_request:
types: [closed]

permissions:
contents: write
pull-requests: write

jobs:
cleanup:
runs-on: ubuntu-latest

steps:
- name: Find and delete preview releases
uses: actions/github-script@v8
with:
script: |
const prNumber = context.payload.pull_request.number;

console.log(`Looking for preview releases for PR #${prNumber}...`);

// Get all releases
const releases = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 100
});

let deletedCount = 0;

// Find and delete preview releases for this PR
for (const release of releases.data) {
// Match pattern: v*-preview.{PR_NUMBER}.*
const previewPattern = new RegExp(`^v.*-preview\\.${prNumber}\\.`);

if (previewPattern.test(release.tag_name)) {
console.log(`Deleting preview release: ${release.tag_name} (${release.name})`);

try {
// Delete the release
await github.rest.repos.deleteRelease({
owner: context.repo.owner,
repo: context.repo.repo,
release_id: release.id
});

// Delete the tag
await github.rest.git.deleteRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${release.tag_name}`
});

deletedCount++;
console.log(`✓ Deleted ${release.tag_name}`);
} catch (error) {
console.error(`✗ Failed to delete ${release.tag_name}: ${error.message}`);
}
}
}

if (deletedCount > 0) {
console.log(`\nSuccessfully deleted ${deletedCount} preview release(s)`);

// Comment on PR if it was merged
if (context.payload.pull_request.merged) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: `🧹 Cleaned up ${deletedCount} preview release(s) for this PR.`
});
}
} else {
console.log('No preview releases found for this PR');
}
4 changes: 4 additions & 0 deletions .github/workflows/draft-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@ on:
push:
tags:
- 'v*-preview*'
- 'v*-preview'
- 'v*-beta*'
- 'v*-beta'
- 'v*-alpha*'
- 'v*-alpha'
- 'v*-rc*'
- 'v*-rc'

permissions:
contents: write
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pr-preview-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,14 @@ jobs:
cd release
zip -r ../minibrew-${{ steps.version.outputs.version }}.zip minibrew/

- name: Create draft release
- name: Create preview release
id: create_release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version.outputs.version }}
name: Preview ${{ steps.version.outputs.version }} (PR #${{ steps.pr.outputs.number }})
body_path: changelog.md
draft: true
draft: false
prerelease: true
files: |
minibrew-${{ steps.version.outputs.version }}.zip
Expand Down
10 changes: 3 additions & 7 deletions custom_components/minibrew/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,8 @@ async def _handle_user_input(self, user_input: dict) -> FlowResult:

except ConnectionError:
return self._show_user_form(errors={"base": "cannot_connect"})
except ConnectionError:
return self._show_user_form(errors={"host": "cannot_connect"})
except RuntimeError:
except Exception as err:
_LOGGER.error("Unexpected error: %s", err)
return self._show_user_form(errors={"base": "unknown_error"})


Expand All @@ -75,14 +74,11 @@ def _is_existing_entry(self, unique_id: str) -> bool:
@staticmethod
@callback
def async_get_options_flow(config_entry):
return PymbrewClientOptionsFlowHandler(config_entry) # Implement options flow if needed
return PymbrewClientOptionsFlowHandler()

class PymbrewClientOptionsFlowHandler(config_entries.OptionsFlow):
"""Handle options flow for PymbrewClient."""

def __init__(self, config_entry):
self.config_entry = config_entry

async def async_step_init(self, user_input=None):
"""Manage the options."""
if user_input is not None:
Expand Down
Loading