Skip to content

Commit 3968c84

Browse files
committed
fix broken match_version for prereleases
In 48437ea the semver-match excluded pre-releases and the fallback logic only worked for `*`. This change brings it back to the original behavior.
1 parent ae08be0 commit 3968c84

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

src/web/mod.rs

+35-9
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)