From add4ffc200ec9f1f90aa8aef7c4a71693dea3708 Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Mon, 12 Jul 2021 14:56:24 +0800 Subject: [PATCH 1/2] Reject when using features in replace Signed-off-by: hi-rustin --- src/cargo/core/resolver/dep_cache.rs | 8 +++++ tests/testsuite/replace.rs | 49 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/cargo/core/resolver/dep_cache.rs b/src/cargo/core/resolver/dep_cache.rs index cf7b9fcfa51..4bbb9311b1c 100644 --- a/src/cargo/core/resolver/dep_cache.rs +++ b/src/cargo/core/resolver/dep_cache.rs @@ -105,6 +105,14 @@ impl<'a> RegistryQueryer<'a> { dep.version_req() ); + if dep.features().len() != 0 || !dep.uses_default_features() { + anyhow::bail!( + "patch for `{}` uses the features mechanism. \ + default-features and features will not take effect because the patch dependency does not support this mechanism", + dep.package_name() + ); + } + let mut summaries = self.registry.query_vec(dep, false)?.into_iter(); let s = summaries.next().ok_or_else(|| { anyhow::format_err!( diff --git a/tests/testsuite/replace.rs b/tests/testsuite/replace.rs index ad535eb13f9..010c88384df 100644 --- a/tests/testsuite/replace.rs +++ b/tests/testsuite/replace.rs @@ -52,6 +52,55 @@ fn override_simple() { .run(); } +#[cargo_test] +fn override_with_features() { + Package::new("bar", "0.1.0").publish(); + + let bar = git::repo(&paths::root().join("override")) + .file("Cargo.toml", &basic_manifest("bar", "0.1.0")) + .file("src/lib.rs", "pub fn bar() {}") + .build(); + + let p = project() + .file( + "Cargo.toml", + &format!( + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [dependencies] + bar = "0.1.0" + + [replace] + "bar:0.1.0" = {{ git = '{}', features = ["some_feature"] }} + "#, + bar.url() + ), + ) + .file( + "src/lib.rs", + "extern crate bar; pub fn foo() { bar::bar(); }", + ) + .build(); + + p.cargo("build") + .with_status(101) + .with_stderr( + "\ +[UPDATING] [..] index +[ERROR] failed to get `bar` as a dependency of package `foo v0.0.1 ([..])` + +Caused by: + patch for `bar` uses the features mechanism. default-features and features \ +will not take effect because the patch dependency does not support this mechanism +", + ) + .run(); +} + #[cargo_test] fn missing_version() { let p = project() From 771356d821a6c64df01853189f69d3c4d9c2b1ba Mon Sep 17 00:00:00 2001 From: hi-rustin Date: Fri, 23 Jul 2021 15:00:50 +0800 Subject: [PATCH 2/2] Warning when using features in replace Signed-off-by: hi-rustin --- src/cargo/core/resolver/dep_cache.rs | 8 ---- src/cargo/ops/resolve.rs | 10 +++++ tests/testsuite/replace.rs | 59 +++++++++++++++++++++++++--- 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/cargo/core/resolver/dep_cache.rs b/src/cargo/core/resolver/dep_cache.rs index 4bbb9311b1c..cf7b9fcfa51 100644 --- a/src/cargo/core/resolver/dep_cache.rs +++ b/src/cargo/core/resolver/dep_cache.rs @@ -105,14 +105,6 @@ impl<'a> RegistryQueryer<'a> { dep.version_req() ); - if dep.features().len() != 0 || !dep.uses_default_features() { - anyhow::bail!( - "patch for `{}` uses the features mechanism. \ - default-features and features will not take effect because the patch dependency does not support this mechanism", - dep.package_name() - ); - } - let mut summaries = self.registry.query_vec(dep, false)?.into_iter(); let s = summaries.next().ok_or_else(|| { anyhow::format_err!( diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 6a08a08d3f6..f52241f9be2 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -113,6 +113,16 @@ pub fn resolve_ws_with_opts<'cfg>( .shell() .warn(format!("package replacement is not used: {}", replace_spec))? } + + if dep.features().len() != 0 || !dep.uses_default_features() { + ws.config() + .shell() + .warn(format!( + "replacement for `{}` uses the features mechanism. \ + default-features and features will not take effect because the replacement dependency does not support this mechanism", + dep.package_name() + ))? + } } Some(resolve) diff --git a/tests/testsuite/replace.rs b/tests/testsuite/replace.rs index 010c88384df..bf12a2e57ab 100644 --- a/tests/testsuite/replace.rs +++ b/tests/testsuite/replace.rs @@ -87,15 +87,64 @@ fn override_with_features() { .build(); p.cargo("build") - .with_status(101) .with_stderr( "\ [UPDATING] [..] index -[ERROR] failed to get `bar` as a dependency of package `foo v0.0.1 ([..])` +[UPDATING] git repository `[..]` +[WARNING] replacement for `bar` uses the features mechanism. default-features and features \ +will not take effect because the replacement dependency does not support this mechanism +[COMPILING] bar v0.1.0 (file://[..]) +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] +", + ) + .run(); +} -Caused by: - patch for `bar` uses the features mechanism. default-features and features \ -will not take effect because the patch dependency does not support this mechanism +#[cargo_test] +fn override_with_setting_default_features() { + Package::new("bar", "0.1.0").publish(); + + let bar = git::repo(&paths::root().join("override")) + .file("Cargo.toml", &basic_manifest("bar", "0.1.0")) + .file("src/lib.rs", "pub fn bar() {}") + .build(); + + let p = project() + .file( + "Cargo.toml", + &format!( + r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [dependencies] + bar = "0.1.0" + + [replace] + "bar:0.1.0" = {{ git = '{}', default-features = false, features = ["none_default_feature"] }} + "#, + bar.url() + ), + ) + .file( + "src/lib.rs", + "extern crate bar; pub fn foo() { bar::bar(); }", + ) + .build(); + + p.cargo("build") + .with_stderr( + "\ +[UPDATING] [..] index +[UPDATING] git repository `[..]` +[WARNING] replacement for `bar` uses the features mechanism. default-features and features \ +will not take effect because the replacement dependency does not support this mechanism +[COMPILING] bar v0.1.0 (file://[..]) +[COMPILING] foo v0.0.1 ([CWD]) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] ", ) .run();