Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[beta] 1.56 backports #9958

Merged
merged 2 commits into from
Oct 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ cargo-util = { path = "crates/cargo-util", version = "0.1.1" }
crates-io = { path = "crates/crates-io", version = "0.33.0" }
crossbeam-utils = "0.8"
curl = { version = "0.4.38", features = ["http2"] }
curl-sys = "0.4.45"
curl-sys = "0.4.48"
env_logger = "0.9.0"
pretty_env_logger = { version = "0.4", optional = true }
anyhow = "1.0"
Expand Down
46 changes: 9 additions & 37 deletions src/cargo/core/compiler/job_queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::{
Expand All @@ -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};
Expand Down Expand Up @@ -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(())
}
}
21 changes: 13 additions & 8 deletions src/cargo/ops/fix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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.
",
)?;
}
Expand Down