1
1
use super :: { match_version, redirect_base, render_markdown, MatchSemver , MetaData } ;
2
- use crate :: utils:: get_correct_docsrs_style_file;
2
+ use crate :: utils:: { get_correct_docsrs_style_file, report_error } ;
3
3
use crate :: { db:: Pool , impl_webpage, repositories:: RepositoryStatsUpdater , web:: page:: WebPage } ;
4
+ use anyhow:: anyhow;
4
5
use chrono:: { DateTime , Utc } ;
5
6
use iron:: prelude:: * ;
6
7
use iron:: Url ;
@@ -74,6 +75,7 @@ pub struct Release {
74
75
pub build_status : bool ,
75
76
pub yanked : bool ,
76
77
pub is_library : bool ,
78
+ pub rustdoc_status : bool ,
77
79
}
78
80
79
81
impl CrateDetails {
@@ -232,12 +234,13 @@ impl CrateDetails {
232
234
pub fn latest_release ( & self ) -> & Release {
233
235
self . releases
234
236
. iter ( )
235
- . find ( |release| ! release. version . is_prerelease ( ) && !release. yanked )
237
+ . find ( |release| release. version . pre . is_empty ( ) && !release. yanked )
236
238
. unwrap_or ( & self . releases [ 0 ] )
237
239
}
238
240
}
239
241
240
- fn releases_for_crate (
242
+ /// Return all releases for a crate, sorted in descending order by semver
243
+ pub ( crate ) fn releases_for_crate (
241
244
conn : & mut impl GenericClient ,
242
245
crate_id : i32 ,
243
246
) -> Result < Vec < Release > , anyhow:: Error > {
@@ -248,7 +251,8 @@ fn releases_for_crate(
248
251
version,
249
252
build_status,
250
253
yanked,
251
- is_library
254
+ is_library,
255
+ rustdoc_status
252
256
FROM releases
253
257
WHERE
254
258
releases.crate_id = $1" ,
@@ -257,15 +261,23 @@ fn releases_for_crate(
257
261
. into_iter ( )
258
262
. filter_map ( |row| {
259
263
let version: String = row. get ( "version" ) ;
260
- semver:: Version :: parse ( & version)
261
- . map ( | semversion| Release {
264
+ match semver:: Version :: parse ( & version) {
265
+ Ok ( semversion) => Some ( Release {
262
266
id : row. get ( "id" ) ,
263
267
version : semversion,
264
268
build_status : row. get ( "build_status" ) ,
265
269
yanked : row. get ( "yanked" ) ,
266
270
is_library : row. get ( "is_library" ) ,
267
- } )
268
- . ok ( )
271
+ rustdoc_status : row. get ( "rustdoc_status" ) ,
272
+ } ) ,
273
+ Err ( err) => {
274
+ report_error ( & anyhow ! ( err) . context ( format ! (
275
+ "invalid semver in database for crate {}: {}" ,
276
+ crate_id, version
277
+ ) ) ) ;
278
+ None
279
+ }
280
+ }
269
281
} )
270
282
. collect ( ) ;
271
283
@@ -491,55 +503,63 @@ mod tests {
491
503
build_status: true ,
492
504
yanked: false ,
493
505
is_library: true ,
506
+ rustdoc_status: true ,
494
507
id: details. releases[ 0 ] . id,
495
508
} ,
496
509
Release {
497
510
version: semver:: Version :: parse( "0.12.0" ) ?,
498
511
build_status: true ,
499
512
yanked: false ,
500
513
is_library: true ,
514
+ rustdoc_status: true ,
501
515
id: details. releases[ 1 ] . id,
502
516
} ,
503
517
Release {
504
518
version: semver:: Version :: parse( "0.3.0" ) ?,
505
519
build_status: false ,
506
520
yanked: false ,
507
521
is_library: true ,
522
+ rustdoc_status: false ,
508
523
id: details. releases[ 2 ] . id,
509
524
} ,
510
525
Release {
511
526
version: semver:: Version :: parse( "0.2.0" ) ?,
512
527
build_status: true ,
513
528
yanked: true ,
514
529
is_library: true ,
530
+ rustdoc_status: true ,
515
531
id: details. releases[ 3 ] . id,
516
532
} ,
517
533
Release {
518
534
version: semver:: Version :: parse( "0.2.0-alpha" ) ?,
519
535
build_status: true ,
520
536
yanked: false ,
521
537
is_library: true ,
538
+ rustdoc_status: true ,
522
539
id: details. releases[ 4 ] . id,
523
540
} ,
524
541
Release {
525
542
version: semver:: Version :: parse( "0.1.1" ) ?,
526
543
build_status: true ,
527
544
yanked: false ,
528
545
is_library: true ,
546
+ rustdoc_status: true ,
529
547
id: details. releases[ 5 ] . id,
530
548
} ,
531
549
Release {
532
550
version: semver:: Version :: parse( "0.1.0" ) ?,
533
551
build_status: true ,
534
552
yanked: false ,
535
553
is_library: true ,
554
+ rustdoc_status: true ,
536
555
id: details. releases[ 6 ] . id,
537
556
} ,
538
557
Release {
539
558
version: semver:: Version :: parse( "0.0.1" ) ?,
540
559
build_status: false ,
541
560
yanked: false ,
542
561
is_library: false ,
562
+ rustdoc_status: false ,
543
563
id: details. releases[ 7 ] . id,
544
564
} ,
545
565
]
0 commit comments