@@ -165,11 +165,7 @@ def _is_expected_nightly_fetch_error(exc: BaseException) -> bool:
165165 JSONDecodeError ,
166166 FetchReleaseError ,
167167 )
168- if isinstance (exc , expected_types ):
169- return True
170-
171- cause = getattr (exc , "__cause__" , None ) or getattr (exc , "__context__" , None )
172- return isinstance (cause , expected_types )
168+ return isinstance (exc , expected_types )
173169
174170 async def get_nightly_release (self ) -> dict | None :
175171 nightly_release_url = f"{ self .GITHUB_RELEASE_API } /tags/{ self .NIGHTLY_TAG } "
@@ -192,27 +188,20 @@ async def get_nightly_release(self) -> dict | None:
192188 return None
193189 return nightly_releases [0 ]
194190
195- async def get_releases_with_nightly (self ) -> list :
191+ async def _fetch_all_releases (self , include_nightly : bool ) -> list :
196192 releases = await self .get_releases ()
193+ if not include_nightly :
194+ return releases
195+
197196 nightly_release = await self .get_nightly_release ()
198197 if nightly_release and all (
199198 item .get ("tag_name" ) != self .NIGHTLY_TAG for item in releases
200199 ):
201200 releases .insert (0 , nightly_release )
202201 return releases
203202
204- def _resolve_nightly_target (self ) -> tuple [str , str ]:
205- archive_base = self .GITHUB_ARCHIVE_BASE
206- return self .NIGHTLY_TAG , (f"{ archive_base } /refs/tags/{ self .NIGHTLY_TAG } .zip" )
207-
208- def _resolve_commit_target (self , version_str : str ) -> tuple [str , str ]:
209- if len (version_str ) != 40 :
210- raise Exception ("commit hash 长度不正确,应为 40" )
211- archive_base = self .GITHUB_ARCHIVE_BASE
212- return (
213- version_str ,
214- f"{ archive_base } /{ version_str } .zip" ,
215- )
203+ async def get_releases_with_nightly (self ) -> list :
204+ return await self ._fetch_all_releases (include_nightly = True )
216205
217206 async def _resolve_update_target (
218207 self ,
@@ -221,14 +210,25 @@ async def _resolve_update_target(
221210 ) -> tuple [str , str ]:
222211 version_str = str (version ).strip () if version is not None else ""
223212
213+ if (
214+ not latest
215+ and version_str
216+ and version_str .lower () != self .NIGHTLY_TAG
217+ and not version_str .startswith ("v" )
218+ ):
219+ if len (version_str ) != 40 :
220+ raise Exception ("commit hash 长度不正确,应为 40" )
221+ return version_str , f"{ self .GITHUB_ARCHIVE_BASE } /{ version_str } .zip"
222+
223+ include_nightly = version_str .lower () == self .NIGHTLY_TAG
224+ releases = await self ._fetch_all_releases (include_nightly = include_nightly )
225+
224226 if latest :
225- releases = await self .get_releases ()
226227 latest_release = next (
227228 (
228229 item
229230 for item in releases
230231 if (tag := item .get ("tag_name" , "" ))
231- and tag .lower () != self .NIGHTLY_TAG
232232 and not PRERELEASE_TAG_REGEX .search (tag )
233233 ),
234234 None ,
@@ -242,16 +242,30 @@ async def _resolve_update_target(
242242 return latest_version , latest_release ["zipball_url" ]
243243
244244 if version_str .lower () == self .NIGHTLY_TAG :
245- return self ._resolve_nightly_target ()
245+ nightly_release = next (
246+ (
247+ item
248+ for item in releases
249+ if item .get ("tag_name" , "" ).lower () == self .NIGHTLY_TAG
250+ ),
251+ None ,
252+ )
253+ if nightly_release is not None :
254+ return self .NIGHTLY_TAG , nightly_release ["zipball_url" ]
255+ return self .NIGHTLY_TAG , (
256+ f"{ self .GITHUB_ARCHIVE_BASE } /refs/tags/{ self .NIGHTLY_TAG } .zip"
257+ )
246258
247259 if version_str .startswith ("v" ):
248- releases = await self .get_releases ()
249260 for data in releases :
250261 if data .get ("tag_name" ) == version_str :
251262 return version_str , data ["zipball_url" ]
252263 raise Exception (f"未找到版本号为 { version_str } 的更新文件。" )
253264
254- return self ._resolve_commit_target (version_str )
265+ if version_str :
266+ raise Exception ("commit hash 长度不正确,应为 40" )
267+
268+ raise Exception ("未指定有效的更新目标。" )
255269
256270 async def update (self , reboot = False , latest = True , version = None , proxy = "" ) -> None :
257271 if os .environ .get ("ASTRBOT_CLI" ) or os .environ .get ("ASTRBOT_LAUNCHER" ):
0 commit comments