@@ -220,6 +220,7 @@ struct MatchVersion {
220
220
/// dashes (`-`) replaced with underscores (`_`) and vice versa.
221
221
pub corrected_name : Option < String > ,
222
222
pub version : MatchSemver ,
223
+ pub rustdoc_status : bool ,
223
224
}
224
225
225
226
impl MatchVersion {
@@ -284,9 +285,12 @@ fn match_version(
284
285
. unwrap_or_else ( || "*" . into ( ) ) ;
285
286
286
287
let mut corrected_name = None ;
287
- let versions: Vec < ( String , i32 , bool ) > = {
288
- let query = "SELECT name, version, releases.id, releases.yanked
289
- FROM releases INNER JOIN crates ON releases.crate_id = crates.id
288
+ let versions: Vec < ( String , i32 , bool , bool ) > = {
289
+ let query = "
290
+ SELECT
291
+ name, version, releases.id, releases.yanked, releases.rustdoc_status
292
+ FROM releases
293
+ INNER JOIN crates ON releases.crate_id = crates.id
290
294
WHERE normalize_crate_name(name) = normalize_crate_name($1)" ;
291
295
292
296
let rows = conn. query ( query, & [ & name] ) . unwrap ( ) ;
@@ -300,7 +304,7 @@ fn match_version(
300
304
}
301
305
} ;
302
306
303
- rows. map ( |row| ( row. get ( 1 ) , row. get ( 2 ) , row. get ( 3 ) ) )
307
+ rows. map ( |row| ( row. get ( 1 ) , row. get ( 2 ) , row. get ( 3 ) , row . get ( 4 ) ) )
304
308
. collect ( )
305
309
} ;
306
310
@@ -309,10 +313,13 @@ fn match_version(
309
313
}
310
314
311
315
// first check for exact match, we can't expect users to use semver in query
312
- if let Some ( ( version, id, _) ) = versions. iter ( ) . find ( |( vers, _, _) | vers == & req_version) {
316
+ if let Some ( ( version, id, _yanked, rustdoc_status) ) =
317
+ versions. iter ( ) . find ( |( vers, _, _, _) | vers == & req_version)
318
+ {
313
319
return Ok ( MatchVersion {
314
320
corrected_name,
315
321
version : MatchSemver :: Exact ( ( version. to_owned ( ) , * id) ) ,
322
+ rustdoc_status : * rustdoc_status,
316
323
} ) ;
317
324
}
318
325
@@ -321,9 +328,9 @@ fn match_version(
321
328
322
329
// we need to sort versions first
323
330
let versions_sem = {
324
- let mut versions_sem: Vec < ( Version , i32 ) > = Vec :: with_capacity ( versions. len ( ) ) ;
331
+ let mut versions_sem: Vec < ( Version , i32 , bool ) > = Vec :: with_capacity ( versions. len ( ) ) ;
325
332
326
- for version in versions. iter ( ) . filter ( |( _, _, yanked) | !yanked) {
333
+ for version in versions. iter ( ) . filter ( |( _, _, yanked, _ ) | !yanked) {
327
334
// in theory a crate must always have a semver compatible version,
328
335
// but check result just in case
329
336
let version_sem = Version :: parse ( & version. 0 )
@@ -337,21 +344,22 @@ fn match_version(
337
344
report_error ( & err) ;
338
345
Nope :: InternalServerError
339
346
} ) ?;
340
- versions_sem. push ( ( version_sem, version. 1 ) ) ;
347
+ versions_sem. push ( ( version_sem, version. 1 , version . 3 ) ) ;
341
348
}
342
349
343
350
versions_sem. sort ( ) ;
344
351
versions_sem. reverse ( ) ;
345
352
versions_sem
346
353
} ;
347
354
348
- if let Some ( ( version, id) ) = versions_sem
355
+ if let Some ( ( version, id, rustdoc_status ) ) = versions_sem
349
356
. iter ( )
350
- . find ( |( vers, _) | req_sem_ver. matches ( vers) )
357
+ . find ( |( vers, _, _ ) | req_sem_ver. matches ( vers) )
351
358
{
352
359
return Ok ( MatchVersion {
353
360
corrected_name,
354
361
version : MatchSemver :: Semver ( ( version. to_string ( ) , * id) ) ,
362
+ rustdoc_status : * rustdoc_status,
355
363
} ) ;
356
364
}
357
365
@@ -363,6 +371,7 @@ fn match_version(
363
371
. map ( |v| MatchVersion {
364
372
corrected_name,
365
373
version : MatchSemver :: Semver ( ( v. 0 . to_string ( ) , v. 1 ) ) ,
374
+ rustdoc_status : v. 2 ,
366
375
} )
367
376
. ok_or ( Nope :: VersionNotFound ) ;
368
377
}
0 commit comments