@@ -96,6 +96,7 @@ impl ToJson for CrateDetails {
96
96
struct Release {
97
97
pub version : String ,
98
98
pub build_status : bool ,
99
+ pub yanked : bool ,
99
100
}
100
101
101
102
@@ -235,21 +236,11 @@ impl CrateDetails {
235
236
crate_details. owners . push ( ( row. get ( 0 ) , row. get ( 1 ) ) ) ;
236
237
}
237
238
238
- // retrieve last successful build if build failed
239
239
if !crate_details. build_status {
240
- let rows = conn. query (
241
- "SELECT version
242
- FROM releases
243
- INNER JOIN crates ON releases.crate_id = crates.id
244
- WHERE build_status = true AND yanked = false AND crates.name = $1
245
- ORDER BY release_time desc
246
- LIMIT 1;" ,
247
- & [ & name] ,
248
- ) . unwrap ( ) ;
249
-
250
- if rows. len ( ) >= 1 {
251
- crate_details. last_successful_build = Some ( rows. get ( 0 ) . get ( 0 ) ) ;
252
- }
240
+ crate_details. last_successful_build = crate_details. releases . iter ( )
241
+ . filter ( |release| release. build_status && !release. yanked )
242
+ . map ( |release| release. version . to_owned ( ) )
243
+ . nth ( 0 ) ;
253
244
}
254
245
255
246
Some ( crate_details)
@@ -264,19 +255,19 @@ impl CrateDetails {
264
255
265
256
fn map_to_release ( conn : & Connection , crate_id : i32 , version : String ) -> Release {
266
257
let rows = conn. query (
267
- "SELECT build_status
258
+ "SELECT build_status, yanked
268
259
FROM releases
269
260
WHERE releases.crate_id = $1 and releases.version = $2;" ,
270
261
& [ & crate_id, & version] ,
271
262
) . unwrap ( ) ;
272
263
273
- let build_status = if !rows. is_empty ( ) {
274
- rows. get ( 0 ) . get ( 0 )
264
+ let ( build_status, yanked ) = if !rows. is_empty ( ) {
265
+ ( rows. get ( 0 ) . get ( 0 ) , rows . get ( 0 ) . get ( 1 ) )
275
266
} else {
276
- false
267
+ Default :: default ( )
277
268
} ;
278
269
279
- Release { version, build_status }
270
+ Release { version, build_status, yanked }
280
271
}
281
272
282
273
@@ -401,18 +392,18 @@ mod tests {
401
392
db. fake_release ( ) . name ( "foo" ) . version ( "0.3.0" ) . build_result_successful ( false ) . create ( ) ?;
402
393
db. fake_release ( ) . name ( "foo" ) . version ( "1.0.0" ) . create ( ) ?;
403
394
db. fake_release ( ) . name ( "foo" ) . version ( "0.12.0" ) . create ( ) ?;
404
- db. fake_release ( ) . name ( "foo" ) . version ( "0.2.0" ) . create ( ) ?;
395
+ db. fake_release ( ) . name ( "foo" ) . version ( "0.2.0" ) . cratesio_data_yanked ( true ) . create ( ) ?;
405
396
db. fake_release ( ) . name ( "foo" ) . version ( "0.2.0-alpha" ) . create ( ) ?;
406
397
407
398
let details = CrateDetails :: new ( & db. conn ( ) , "foo" , "0.2.0" ) . unwrap ( ) ;
408
399
assert_eq ! ( details. releases, vec![
409
- Release { version: "1.0.0" . to_string( ) , build_status: true } ,
410
- Release { version: "0.12.0" . to_string( ) , build_status: true } ,
411
- Release { version: "0.3.0" . to_string( ) , build_status: false } ,
412
- Release { version: "0.2.0" . to_string( ) , build_status: true } ,
413
- Release { version: "0.2.0-alpha" . to_string( ) , build_status: true } ,
414
- Release { version: "0.1.1" . to_string( ) , build_status: true } ,
415
- Release { version: "0.1.0" . to_string( ) , build_status: true } ,
400
+ Release { version: "1.0.0" . to_string( ) , build_status: true , yanked : false } ,
401
+ Release { version: "0.12.0" . to_string( ) , build_status: true , yanked : false } ,
402
+ Release { version: "0.3.0" . to_string( ) , build_status: false , yanked : false } ,
403
+ Release { version: "0.2.0" . to_string( ) , build_status: true , yanked : true } ,
404
+ Release { version: "0.2.0-alpha" . to_string( ) , build_status: true , yanked : false } ,
405
+ Release { version: "0.1.1" . to_string( ) , build_status: true , yanked : false } ,
406
+ Release { version: "0.1.0" . to_string( ) , build_status: true , yanked : false } ,
416
407
] ) ;
417
408
418
409
Ok ( ( ) )
0 commit comments