From b26d30ac34a766448b012c11396aa8aab2685fd8 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Wed, 21 Mar 2018 10:17:54 -0700 Subject: [PATCH 1/2] Make wildcard versions select non-prerelease versions when possible Fall back to the highest version only when normal semver matching fails. --- src/web/mod.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/web/mod.rs b/src/web/mod.rs index 20f282542..a82ae5c9c 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -283,18 +283,18 @@ fn match_version(conn: &Connection, name: &str, version: Option<&str>) -> Option versions_sem }; - // semver is acting weird for '*' (any) range if a crate only have pre-release versions - // return first version if requested version is '*' - if req_version == "*" && !versions_sem.is_empty() { - return Some(format!("{}", versions_sem[0])); - } - for version in &versions_sem { if req_sem_ver.matches(&version) { return Some(format!("{}", version)); } } + // For crates that have only pre-release versions, ranges like '"*"' will not match any + // versions. Return the first version if requested version is '*'. + if req_version == "*" && !versions_sem.is_empty() { + return Some(format!("{}", versions_sem[0])); + } + None } From 105cbc70910e992c8a07c7f078c967995672f27d Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Wed, 21 Mar 2018 10:34:14 -0700 Subject: [PATCH 2/2] More flexible range matching for pre-release versions This will allow wildcard ranges like `1.5.*` to match pre-release versions if no other matching versions are found. --- src/web/mod.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/web/mod.rs b/src/web/mod.rs index a82ae5c9c..0eb2e22fe 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -290,9 +290,14 @@ fn match_version(conn: &Connection, name: &str, version: Option<&str>) -> Option } // For crates that have only pre-release versions, ranges like '"*"' will not match any - // versions. Return the first version if requested version is '*'. - if req_version == "*" && !versions_sem.is_empty() { - return Some(format!("{}", versions_sem[0])); + // versions. Try matching without the pre-release tag. + for version in &versions_sem { + let mut version_without_pre = version.clone(); + version_without_pre.pre.clear(); + + if req_sem_ver.matches(&version_without_pre) { + return Some(format!("{}", version)); + } } None