@@ -328,7 +328,7 @@ fn match_version(
328
328
}
329
329
}
330
330
331
- // Now try to match with semver, tread `newest` and `latest` as `*`
331
+ // Now try to match with semver, treat `newest` and `latest` as `*`
332
332
let req_semver = if req_version == "newest" || req_version == "latest" {
333
333
VersionReq :: STAR
334
334
} else {
@@ -342,10 +342,14 @@ fn match_version(
342
342
} ) ?
343
343
} ;
344
344
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
+ {
349
353
return Ok ( MatchVersion {
350
354
corrected_name,
351
355
version : if input_version == Some ( "latest" ) {
@@ -357,12 +361,12 @@ fn match_version(
357
361
} ) ;
358
362
}
359
363
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.
362
367
if req_semver == VersionReq :: STAR {
363
368
return releases
364
- . iter ( )
365
- . find ( |release| !release. yanked )
369
+ . first ( )
366
370
. map ( |release| MatchVersion {
367
371
corrected_name : corrected_name. clone ( ) ,
368
372
version : MatchSemver :: Semver ( ( release. version . to_string ( ) , release. id ) ) ,
@@ -878,6 +882,28 @@ mod test {
878
882
} ) ;
879
883
}
880
884
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
+
881
907
#[ test]
882
908
// vaguely related to https://github.com/rust-lang/docs.rs/issues/395
883
909
fn metadata_has_no_effect ( ) {
0 commit comments