@@ -328,7 +328,7 @@ fn match_version(
328328 }
329329 }
330330
331- // Now try to match with semver, tread `newest` and `latest` as `*`
331+ // Now try to match with semver, treat `newest` and `latest` as `*`
332332 let req_semver = if req_version == "newest" || req_version == "latest" {
333333 VersionReq :: STAR
334334 } else {
@@ -342,10 +342,14 @@ fn match_version(
342342 } ) ?
343343 } ;
344344
345- // try to match the version in all un-yanked non-prerelease releases.
346- if let Some ( release) = releases. iter ( ) . find ( |release| {
347- !release. yanked && release. version . pre . is_empty ( ) && req_semver. matches ( & release. version )
348- } ) {
345+ // starting here, we only look at non-yanked releases
346+ let releases: Vec < _ > = releases. iter ( ) . filter ( |r| !r. yanked ) . collect ( ) ;
347+
348+ // try to match the version in all un-yanked releases.
349+ if let Some ( release) = releases
350+ . iter ( )
351+ . find ( |release| req_semver. matches ( & release. version ) )
352+ {
349353 return Ok ( MatchVersion {
350354 corrected_name,
351355 version : if input_version == Some ( "latest" ) {
@@ -357,12 +361,12 @@ fn match_version(
357361 } ) ;
358362 }
359363
360- // If the latest version was requested and not found until here,
361- // Just return the newest un-yanked release, which includes pre-releases.
364+ // semver `*` does not match pre-releases.
365+ // When someone wants the latest release and we have only pre-releases
366+ // just return the latest prerelease.
362367 if req_semver == VersionReq :: STAR {
363368 return releases
364- . iter ( )
365- . find ( |release| !release. yanked )
369+ . first ( )
366370 . map ( |release| MatchVersion {
367371 corrected_name : corrected_name. clone ( ) ,
368372 version : MatchSemver :: Semver ( ( release. version . to_string ( ) , release. id ) ) ,
@@ -878,6 +882,28 @@ mod test {
878882 } ) ;
879883 }
880884
885+ #[ test]
886+ // https://github.com/rust-lang/docs.rs/issues/1682
887+ fn prereleases_are_considered_when_others_dont_match ( ) {
888+ wrapper ( |env| {
889+ let db = env. db ( ) ;
890+
891+ // normal release
892+ release ( "1.0.0" , env) ;
893+ // prereleases
894+ release ( "2.0.0-alpha.1" , env) ;
895+ release ( "2.0.0-alpha.2" , env) ;
896+
897+ // STAR gives me the prod release
898+ assert_eq ! ( version( Some ( "*" ) , db) , exact( "1.0.0" ) ) ;
899+
900+ // prerelease query gives me the latest prerelease
901+ assert_eq ! ( version( Some ( ">=2.0.0-alpha" ) , db) , exact( "2.0.0-alpha.2" ) ) ;
902+
903+ Ok ( ( ) )
904+ } )
905+ }
906+
881907 #[ test]
882908 // vaguely related to https://github.com/rust-lang/docs.rs/issues/395
883909 fn metadata_has_no_effect ( ) {
0 commit comments