Auto merge of #9927 - weiznich:diesel_2021_edition, r=ehuss

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
This commit is contained in:
bors 2021-09-21 15:24:03 +00:00
commit e79ba78087
2 changed files with 22 additions and 45 deletions

View 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(())
}
}

View 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.
",
)?;
}