diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 3957976d3cb..c186b5263e3 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -782,6 +782,10 @@ impl RemainingCandidates { // Versions `a` and `b` are compatible if their left-most nonzero digit is the // same. fn compatible(a: &semver::Version, b: &semver::Version) -> bool { + if !a.pre.is_empty() || !b.pre.is_empty() { + return a == b; + } + if a.major != b.major { return false; } diff --git a/tests/testsuite/resolve.rs b/tests/testsuite/resolve.rs index b71f9c07571..acf8b10cb24 100644 --- a/tests/testsuite/resolve.rs +++ b/tests/testsuite/resolve.rs @@ -509,7 +509,7 @@ fn resolving_backtrack_features() { } #[test] -fn resolving_allows_multiple_compatible_versions() { +fn resolving_allows_multiple_incompatible_versions() { let reg = registry(vec![ pkg!(("foo", "1.0.0")), pkg!(("foo", "2.0.0")), @@ -541,6 +541,39 @@ fn resolving_allows_multiple_compatible_versions() { ); } +#[test] +fn resolving_allows_multiple_prerelease_versions() { + let reg = registry(vec![ + pkg!(("foo", "1.0.0")), + pkg!(("foo", "2.0.0")), + pkg!(("foo", "2.0.0-alpha")), + pkg!(("foo", "2.0.0-beta")), + pkg!("bar" => ["d1", "d2", "d3", "d4"]), + pkg!("d1" => [dep_req("foo", "=1")]), + pkg!("d2" => [dep_req("foo", "=2")]), + pkg!("d3" => [dep_req("foo", "=2.0.0-alpha")]), + pkg!("d4" => [dep_req("foo", "=2.0.0-beta")]), + ]); + + let res = resolve(&pkg_id("root"), vec![dep("bar")], ®).unwrap(); + + assert_contains( + &res, + &names(&[ + ("root", "1.0.0"), + ("foo", "1.0.0"), + ("foo", "2.0.0"), + ("foo", "2.0.0-alpha"), + ("foo", "2.0.0-beta"), + ("d1", "1.0.0"), + ("d2", "1.0.0"), + ("d3", "1.0.0"), + ("d4", "1.0.0"), + ("bar", "1.0.0"), + ]), + ); +} + #[test] fn resolving_with_deep_backtracking() { let reg = registry(vec![