]> git.proxmox.com Git - cargo.git/commitdiff
Auto merge of #9927 - weiznich:diesel_2021_edition, r=ehuss
authorbors <bors@rust-lang.org>
Tue, 21 Sep 2021 15:24:03 +0000 (15:24 +0000)
committerEric Huss <eric@huss.org>
Mon, 4 Oct 2021 16:22:58 +0000 (09:22 -0700)
Change diesel compatibility messages

Diesel 1.4.8 fixes the critical behaviour. This commit changes the
corresponding messages for `cargo fix` and normal builds to prompt the
user to just update the diesel version to fix the corresponding
compilation errors.

As discussed in https://github.com/rust-lang/rust/issues/88903#issuecomment-923061946

Fixes https://github.com/rust-lang/rust/issues/88903
Fixes #9450

src/cargo/core/compiler/job_queue.rs
src/cargo/ops/fix.rs

index 067d2339f0abe10abc41abd2cbf09e098b40c286..d5a59bae04bf2f73bf4aa890f5283239a47dade1 100644 (file)
@@ -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 <https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions>
-  for more information).
+feature resolver. Try updating to diesel 1.4.8 to fix this error.
 ",
-            unit.pkg.version(),
-            features_suggestion
-        ))?;
+        )?;
         Ok(())
     }
 }
index c373a9b8fcb2fc39057ad4694b9699d8624f296b..b3e08791098acf2f93b9982bf707522472ec4520 100644 (file)
@@ -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
-<https://github.com/rust-lang/cargo/issues/9450> 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.
 ",
         )?;
     }