diff --git a/custom_components/bahmcloud_store/core.py b/custom_components/bahmcloud_store/core.py index b4ab03c..4e7c5e6 100644 --- a/custom_components/bahmcloud_store/core.py +++ b/custom_components/bahmcloud_store/core.py @@ -20,7 +20,7 @@ from homeassistant.helpers import issue_registry as ir from homeassistant.util import yaml as ha_yaml from .storage import BCSStorage, CustomRepo -from .providers import fetch_repo_info, detect_provider, RepoInfo, fetch_readme_markdown +from .providers import fetch_repo_info, detect_provider, RepoInfo, fetch_readme_markdown, fetch_repo_versions from .metadata import fetch_repo_metadata, RepoMetadata _LOGGER = logging.getLogger(__name__) @@ -415,6 +415,23 @@ class BCSCore: default_branch=repo.default_branch, ) + async def list_repo_versions(self, repo_id: str, *, limit: int = 20) -> list[dict[str, str]]: + """List installable versions/refs for a repo. + + This is used by the UI to allow selecting an older tag/release. + """ + repo = self.get_repo(repo_id) + if not repo: + raise BCSInstallError(f"repo_id not found: {repo_id}") + + return await fetch_repo_versions( + self.hass, + repo.url, + provider=repo.provider, + default_branch=repo.default_branch, + limit=limit, + ) + def _pick_ref_for_install(self, repo: RepoItem) -> str: if repo.latest_version and str(repo.latest_version).strip(): return str(repo.latest_version).strip() @@ -913,13 +930,14 @@ class BCSCore: self.signal_updated() return {"ok": True, "repo_id": repo_id, "removed": removed, "restart_required": bool(removed)} - async def install_repo(self, repo_id: str) -> dict[str, Any]: + async def install_repo(self, repo_id: str, *, version: str | None = None) -> dict[str, Any]: repo = self.get_repo(repo_id) if not repo: raise BCSInstallError(f"repo_id not found: {repo_id}") async with self._install_lock: - ref = self._pick_ref_for_install(repo) + requested = (version or "").strip() + ref = requested if requested else self._pick_ref_for_install(repo) zip_url = self._build_zip_url(repo.url, ref) _LOGGER.info("BCS install started: repo_id=%s ref=%s zip_url=%s", repo_id, ref, zip_url) @@ -1039,9 +1057,9 @@ class BCSCore: raise raise BCSInstallError(str(e)) from e - async def update_repo(self, repo_id: str) -> dict[str, Any]: + async def update_repo(self, repo_id: str, *, version: str | None = None) -> dict[str, Any]: _LOGGER.info("BCS update started: repo_id=%s", repo_id) - return await self.install_repo(repo_id) + return await self.install_repo(repo_id, version=version) async def request_restart(self) -> None: await self.hass.services.async_call("homeassistant", "restart", {}, blocking=False) \ No newline at end of file