diff --git a/src/cargo/core/compiler/job_queue.rs b/src/cargo/core/compiler/job_queue.rs index 067d2339f0a..d5a59bae04b 100644 --- a/src/cargo/core/compiler/job_queue.rs +++ b/src/cargo/core/compiler/job_queue.rs @@ -62,6 +62,7 @@ use cargo_util::ProcessBuilder; use crossbeam_utils::thread::Scope; use jobserver::{Acquired, Client, HelperThread}; use log::{debug, info, trace}; +use semver::Version; use super::context::OutputFile; use super::job::{ @@ -74,9 +75,8 @@ use crate::core::compiler::future_incompat::{ FutureBreakageItem, FutureIncompatReportPackage, OnDiskReports, }; use crate::core::resolver::ResolveBehavior; -use crate::core::{FeatureValue, PackageId, Shell, TargetKind}; +use crate::core::{PackageId, Shell, TargetKind}; use crate::util::diagnostic_server::{self, DiagnosticPrinter}; -use crate::util::interning::InternedString; use crate::util::machine_message::{self, Message as _}; use crate::util::CargoResult; use crate::util::{self, internal, profile}; @@ -1249,55 +1249,27 @@ impl<'cfg> DrainState<'cfg> { fn back_compat_notice(&self, cx: &Context<'_, '_>, unit: &Unit) -> CargoResult<()> { if unit.pkg.name() != "diesel" - || unit.pkg.version().major != 1 + || unit.pkg.version() >= &Version::new(1, 4, 8) || cx.bcx.ws.resolve_behavior() == ResolveBehavior::V1 || !unit.pkg.package_id().source_id().is_registry() || !unit.features.is_empty() { return Ok(()); } - let other_diesel = match cx + if !cx .bcx .unit_graph .keys() - .find(|unit| unit.pkg.name() == "diesel" && !unit.features.is_empty()) + .any(|unit| unit.pkg.name() == "diesel" && !unit.features.is_empty()) { - Some(u) => u, - // Unlikely due to features. - None => return Ok(()), - }; - let mut features_suggestion: BTreeSet<_> = other_diesel.features.iter().collect(); - let fmap = other_diesel.pkg.summary().features(); - // Remove any unnecessary features. - for feature in &other_diesel.features { - if let Some(feats) = fmap.get(feature) { - for feat in feats { - if let FeatureValue::Feature(f) = feat { - features_suggestion.remove(&f); - } - } - } + return Ok(()); } - features_suggestion.remove(&InternedString::new("default")); - let features_suggestion = toml::to_string(&features_suggestion).unwrap(); - - cx.bcx.config.shell().note(&format!( + cx.bcx.config.shell().note( "\ This error may be due to an interaction between diesel and Cargo's new -feature resolver. Some workarounds you may want to consider: -- Add a build-dependency in Cargo.toml on diesel to force Cargo to add the appropriate - features. This may look something like this: - - [build-dependencies] - diesel = {{ version = \"{}\", features = {} }} - -- Try using the previous resolver by setting `resolver = \"1\"` in `Cargo.toml` - (see - for more information). +feature resolver. Try updating to diesel 1.4.8 to fix this error. ", - unit.pkg.version(), - features_suggestion - ))?; + )?; Ok(()) } } diff --git a/src/cargo/ops/fix.rs b/src/cargo/ops/fix.rs index c373a9b8fcb..b3e08791098 100644 --- a/src/cargo/ops/fix.rs +++ b/src/cargo/ops/fix.rs @@ -50,11 +50,12 @@ use cargo_util::{exit_status_to_string, is_simple_exit_code, paths, ProcessBuild use log::{debug, trace, warn}; use rustfix::diagnostics::Diagnostic; use rustfix::{self, CodeFix}; +use semver::Version; use crate::core::compiler::{CompileKind, RustcTargetData, TargetInfo}; use crate::core::resolver::features::{DiffMap, FeatureOpts, FeatureResolver}; use crate::core::resolver::{HasDevUnits, Resolve, ResolveBehavior}; -use crate::core::{Edition, MaybePackage, Workspace}; +use crate::core::{Edition, MaybePackage, PackageId, Workspace}; use crate::ops::resolve::WorkspaceResolve; use crate::ops::{self, CompileOptions}; use crate::util::diagnostic_server::{Message, RustfixDiagnosticServer}; @@ -321,17 +322,21 @@ fn check_resolver_change(ws: &Workspace<'_>, opts: &FixOptions) -> CargoResult<( } fn report_maybe_diesel(config: &Config, resolve: &Resolve) -> CargoResult<()> { - if resolve - .iter() - .any(|pid| pid.name() == "diesel" && pid.version().major == 1) - && resolve.iter().any(|pid| pid.name() == "diesel_migrations") - { + fn is_broken_diesel(pid: PackageId) -> bool { + pid.name() == "diesel" && pid.version() < &Version::new(1, 4, 8) + } + + fn is_broken_diesel_migration(pid: PackageId) -> bool { + pid.name() == "diesel_migrations" && pid.version().major <= 1 + } + + if resolve.iter().any(is_broken_diesel) && resolve.iter().any(is_broken_diesel_migration) { config.shell().note( "\ This project appears to use both diesel and diesel_migrations. These packages have a known issue where the build may fail due to the version 2 resolver preventing -feature unification between those two packages. See - for some potential workarounds. +feature unification between those two packages. Please update to at least diesel 1.4.8 +to prevent this issue from happening. ", )?; }