@@ -8,6 +8,26 @@ use releasekit::{Filter, Forge, Release};
88use crate :: config;
99use crate :: error:: { Error , Result } ;
1010
11+ fn forge_error ( e : releasekit:: Error , project : & str ) -> Error {
12+ let msg = match & e {
13+ releasekit:: Error :: Http { status, url } => {
14+ format ! ( "HTTP {status} from {url}" )
15+ }
16+ releasekit:: Error :: Network ( detail) => {
17+ let detail = detail. strip_prefix ( "io: " ) . unwrap_or ( detail) ;
18+ format ! ( "failed to connect to release server for {project}: {detail}" )
19+ }
20+ releasekit:: Error :: NoReleases => {
21+ format ! ( "no releases found for {project}" )
22+ }
23+ releasekit:: Error :: NoMatchingAsset => {
24+ format ! ( "no matching asset found for {project}" )
25+ }
26+ _ => format ! ( "{e}" ) ,
27+ } ;
28+ Error :: ForgeApi ( msg)
29+ }
30+
1131#[ derive( Debug , Clone ) ]
1232pub enum ForgeKind {
1333 GitHub ,
@@ -62,7 +82,7 @@ impl ForgeUpdateInfo {
6282 self . with_forge ( |forge| {
6383 forge
6484 . fetch_releases ( & project, None )
65- . map_err ( |e| Error :: ForgeApi ( e . to_string ( ) ) )
85+ . map_err ( |e| forge_error ( e , & project ) )
6686 } )
6787 }
6888
@@ -149,7 +169,7 @@ impl ForgeUpdateInfo {
149169
150170 let releases = forge
151171 . fetch_releases ( & project, tag)
152- . map_err ( |e| Error :: ForgeApi ( e . to_string ( ) ) ) ?;
172+ . map_err ( |e| forge_error ( e , & project ) ) ?;
153173
154174 let release = self . select_release ( releases, tag. is_some ( ) , find_prerelease) ?;
155175
@@ -162,32 +182,36 @@ impl ForgeUpdateInfo {
162182 is_specific_tag : bool ,
163183 find_prerelease : bool ,
164184 ) -> Result < Release > {
185+ let project = format ! ( "{}/{}" , self . owner, self . repo) ;
186+
165187 if is_specific_tag {
166- return releases
167- . into_iter ( )
168- . next ( )
169- . ok_or_else ( || Error :: ForgeApi ( "No release found for tag" . into ( ) ) ) ;
188+ return releases. into_iter ( ) . next ( ) . ok_or_else ( || {
189+ Error :: ForgeApi ( format ! (
190+ "no release found for tag '{}' in {project}" ,
191+ self . tag
192+ ) )
193+ } ) ;
170194 }
171195
172196 if find_prerelease {
173197 return releases
174198 . into_iter ( )
175199 . find ( |r| r. is_prerelease ( ) )
176- . ok_or_else ( || Error :: ForgeApi ( "No prerelease found" . into ( ) ) ) ;
200+ . ok_or_else ( || Error :: ForgeApi ( format ! ( "no prerelease found for {project}" ) ) ) ;
177201 }
178202
179203 if self . tag == "latest" {
180204 return releases
181205 . into_iter ( )
182206 . find ( |r| !r. is_prerelease ( ) )
183- . ok_or_else ( || Error :: ForgeApi ( "No stable release found" . into ( ) ) ) ;
207+ . ok_or_else ( || Error :: ForgeApi ( format ! ( "no stable release found for {project}" ) ) ) ;
184208 }
185209
186210 // latest-all: first release regardless
187211 releases
188212 . into_iter ( )
189213 . next ( )
190- . ok_or_else ( || Error :: ForgeApi ( "No release found" . into ( ) ) )
214+ . ok_or_else ( || Error :: ForgeApi ( format ! ( "no releases found for {project}" ) ) )
191215 }
192216
193217 fn find_matching_asset ( & self , release : & Release ) -> Result < String > {
@@ -202,8 +226,11 @@ impl ForgeUpdateInfo {
202226
203227 if matching. is_empty ( ) {
204228 return Err ( Error :: ForgeApi ( format ! (
205- "No asset matched pattern: *{}" ,
206- self . filename
229+ "no asset matching '*{}' in release {} of {}/{}" ,
230+ self . filename,
231+ release. tag( ) ,
232+ self . owner,
233+ self . repo
207234 ) ) ) ;
208235 }
209236
0 commit comments