From 33f54aaec64b18073899d4ff1b261f2afd306891 Mon Sep 17 00:00:00 2001 From: LIghtJUNction Date: Wed, 8 Apr 2026 21:51:16 +0800 Subject: [PATCH] fix(updator): skip update prompt when prerelease version >= latest stable When user installs a dev/beta/alpha/rc version (e.g. 4.25.0-dev), check_update would skip prerelease releases and compare against the latest stable (e.g. 4.24.0). Since 4.25.0-dev > 4.24.0 in semver comparison (numeric part takes precedence), it incorrectly prompted to update. Now checks if current version is prerelease and already newer than the latest stable - in that case, no update prompt is shown. Fixes: update button shown to users running dev/unstable versions --- astrbot/core/zip_updator.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/astrbot/core/zip_updator.py b/astrbot/core/zip_updator.py index d4bb0c6a7..b97a242dd 100644 --- a/astrbot/core/zip_updator.py +++ b/astrbot/core/zip_updator.py @@ -112,6 +112,16 @@ class RepoZipUpdator: """Semver 版本比较""" return VersionComparator.compare_version(v1, v2) + def _is_prerelease_version(self, version: str) -> bool: + """Check if a version string is a prerelease version.""" + return bool( + re.search( + r"[\-_.]?(alpha|beta|rc|dev)[\-_.]?\d*$", + version, + re.IGNORECASE, + ) + ) + async def check_update( self, url: str, @@ -120,13 +130,16 @@ class RepoZipUpdator: ) -> ReleaseInfo | None: update_data = await self.fetch_release_info(url) + # Check if current version is a prerelease + current_is_prerelease = self._is_prerelease_version(current_version) + sel_release_data = None if consider_prerelease: tag_name = update_data[0]["tag_name"] sel_release_data = update_data[0] else: for data in update_data: - # 跳过带有 alpha、beta 等预发布标签的版本 + # Skip prerelease versions when not considering them if re.search( r"[\-_.]?(alpha|beta|rc|dev)[\-_.]?\d*$", data["tag_name"], @@ -141,6 +154,13 @@ class RepoZipUpdator: logger.error("未找到合适的发布版本") return None + # If current version is a prerelease and we're comparing against stable, + # check if current version is already newer than the latest stable + if current_is_prerelease and not self._is_prerelease_version(tag_name): + if self.compare_version(current_version, tag_name) >= 0: + # Current prerelease version is >= latest stable, no update needed + return None + if self.compare_version(current_version, tag_name) >= 0: return None return ReleaseInfo(