mirror of
https://github.com/rust-lang/cargo
synced 2024-10-03 22:43:59 +00:00
Stabilize future-incompat-report
Depends on https://github.com/rust-lang/rust/pull/91535
This commit is contained in:
parent
f9089fc5be
commit
997bf3fffc
|
@ -1,5 +1,4 @@
|
|||
use crate::command_prelude::*;
|
||||
use anyhow::anyhow;
|
||||
use cargo::core::compiler::future_incompat::{OnDiskReports, REPORT_PREAMBLE};
|
||||
use cargo::drop_println;
|
||||
|
||||
|
@ -24,9 +23,6 @@ pub fn cli() -> App {
|
|||
}
|
||||
|
||||
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
|
||||
if !config.nightly_features_allowed {
|
||||
return Err(anyhow!("`cargo report` can only be used on the nightly channel").into());
|
||||
}
|
||||
match args.subcommand() {
|
||||
("future-incompatibilities", Some(args)) => report_future_incompatibilies(config, args),
|
||||
(cmd, _) => panic!("unexpected command `{}`", cmd),
|
||||
|
|
|
@ -321,9 +321,6 @@ pub fn save_and_display_report(
|
|||
bcx: &BuildContext<'_, '_>,
|
||||
per_package_future_incompat_reports: &[FutureIncompatReportPackage],
|
||||
) {
|
||||
if !bcx.config.cli_unstable().future_incompat_report {
|
||||
return;
|
||||
}
|
||||
let should_display_message = match bcx.config.future_incompat_config() {
|
||||
Ok(config) => config.should_display_message(),
|
||||
Err(e) => {
|
||||
|
|
|
@ -798,6 +798,9 @@ fn add_error_format_and_color(cx: &Context<'_, '_>, cmd: &mut ProcessBuilder, pi
|
|||
// to emit a message that cargo will intercept.
|
||||
json.push_str(",artifacts");
|
||||
}
|
||||
// Always emit a future-incompat report, so we can report
|
||||
// future-incompat dependencies to the user
|
||||
json.push_str(",future-incompat");
|
||||
|
||||
match cx.bcx.build_config.message_format {
|
||||
MessageFormat::Short | MessageFormat::Json { short: true, .. } => {
|
||||
|
@ -1022,10 +1025,6 @@ fn build_base_args(
|
|||
.env("RUSTC_BOOTSTRAP", "1");
|
||||
}
|
||||
|
||||
if bcx.config.cli_unstable().future_incompat_report {
|
||||
cmd.arg("-Z").arg("emit-future-incompat-report");
|
||||
}
|
||||
|
||||
// Add `CARGO_BIN_` environment variables for building tests.
|
||||
if unit.target.is_test() || unit.target.is_bench() {
|
||||
for bin_target in unit
|
||||
|
|
|
@ -637,7 +637,6 @@ unstable_cli_options!(
|
|||
doctest_in_workspace: bool = ("Compile doctests with paths relative to the workspace root"),
|
||||
doctest_xcompile: bool = ("Compile and run doctests for non-host target using runner config"),
|
||||
dual_proc_macros: bool = ("Build proc-macros for both the host and the target"),
|
||||
future_incompat_report: bool = ("Enable creation of a future-incompat report for all dependencies"),
|
||||
features: Option<Vec<String>> = (HIDDEN),
|
||||
jobserver_per_rustc: bool = (HIDDEN),
|
||||
minimal_versions: bool = ("Resolve minimal dependency versions instead of maximum"),
|
||||
|
@ -705,6 +704,9 @@ const STABILIZED_NAMED_PROFILES: &str = "The named-profiles feature is now alway
|
|||
See https://doc.rust-lang.org/nightly/cargo/reference/profiles.html#custom-profiles \
|
||||
for more information";
|
||||
|
||||
const STABILIZED_FUTURE_INCOMPAT_REPORT: &str =
|
||||
"The future-incompat-report feature is now always enabled.";
|
||||
|
||||
fn deserialize_build_std<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
|
@ -894,7 +896,9 @@ impl CliUnstable {
|
|||
"extra-link-arg" => stabilized_warn(k, "1.56", STABILIZED_EXTRA_LINK_ARG),
|
||||
"configurable-env" => stabilized_warn(k, "1.56", STABILIZED_CONFIGURABLE_ENV),
|
||||
"patch-in-config" => stabilized_warn(k, "1.56", STABILIZED_PATCH_IN_CONFIG),
|
||||
"future-incompat-report" => self.future_incompat_report = parse_empty(k, v)?,
|
||||
"future-incompat-report" => {
|
||||
stabilized_warn(k, "1.59.0", STABILIZED_FUTURE_INCOMPAT_REPORT)
|
||||
}
|
||||
_ => bail!("unknown `-Z` flag specified: {}", k),
|
||||
}
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ pub trait AppExt: Sized {
|
|||
fn arg_future_incompat_report(self) -> Self {
|
||||
self._arg(opt(
|
||||
"future-incompat-report",
|
||||
"Outputs a future incompatibility report at the end of the build (unstable)",
|
||||
"Outputs a future incompatibility report at the end of the build",
|
||||
))
|
||||
}
|
||||
}
|
||||
|
@ -512,17 +512,6 @@ pub trait ArgMatchesExt {
|
|||
.cli_unstable()
|
||||
.fail_if_stable_opt("--unit-graph", 8002)?;
|
||||
}
|
||||
if build_config.future_incompat_report {
|
||||
config
|
||||
.cli_unstable()
|
||||
.fail_if_stable_opt("--future-incompat-report", 9241)?;
|
||||
|
||||
if !config.cli_unstable().future_incompat_report {
|
||||
anyhow::bail!(
|
||||
"Usage of `--future-incompat-report` requires `-Z future-incompat-report`"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
let opts = CompileOptions {
|
||||
build_config,
|
||||
|
|
|
@ -25,7 +25,7 @@ fn simple_project() -> Project {
|
|||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn no_output_on_stable() {
|
||||
fn output_on_stable() {
|
||||
if !is_nightly() {
|
||||
// -Zfuture-incompat-test requires nightly (permanently)
|
||||
return;
|
||||
|
@ -33,39 +33,23 @@ fn no_output_on_stable() {
|
|||
let p = simple_project();
|
||||
|
||||
p.cargo("check")
|
||||
// Even though rustc emits the report, cargo ignores it without -Z.
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains(FUTURE_OUTPUT)
|
||||
.with_stderr_does_not_contain("[..]cargo report[..]")
|
||||
.with_stderr_contains("[..]cargo report[..]")
|
||||
.run();
|
||||
}
|
||||
|
||||
// This feature is stable, and should not be gated
|
||||
#[cargo_test]
|
||||
fn gate_future_incompat_report() {
|
||||
fn no_gate_future_incompat_report() {
|
||||
let p = simple_project();
|
||||
|
||||
p.cargo("build --future-incompat-report")
|
||||
.with_stderr_contains("error: the `--future-incompat-report` flag is unstable[..]")
|
||||
.with_status(101)
|
||||
.run();
|
||||
|
||||
// Both `-Z future-incompat-report` and `-Z unstable-opts` are required
|
||||
p.cargo("build --future-incompat-report -Z future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_stderr_contains("error: the `--future-incompat-report` flag is unstable[..]")
|
||||
.with_status(101)
|
||||
.run();
|
||||
|
||||
p.cargo("build --future-incompat-report -Z unstable-options")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_stderr_contains(
|
||||
"error: Usage of `--future-incompat-report` requires `-Z future-incompat-report`",
|
||||
)
|
||||
.with_status(101)
|
||||
.with_status(0)
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities --id foo")
|
||||
.with_stderr_contains("error: `cargo report` can only be used on the nightly channel")
|
||||
.with_stderr_contains("error: no reports are currently available")
|
||||
.with_status(101)
|
||||
.run();
|
||||
}
|
||||
|
@ -83,8 +67,7 @@ fn test_zero_future_incompat() {
|
|||
.build();
|
||||
|
||||
// No note if --future-incompat-report is not specified.
|
||||
p.cargo("build -Z future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo("build")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr(
|
||||
"\
|
||||
|
@ -94,8 +77,7 @@ fn test_zero_future_incompat() {
|
|||
)
|
||||
.run();
|
||||
|
||||
p.cargo("build --future-incompat-report -Z unstable-options -Z future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo("build --future-incompat-report")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr(
|
||||
"\
|
||||
|
@ -117,8 +99,7 @@ fn test_single_crate() {
|
|||
|
||||
for command in &["build", "check", "rustc", "test"] {
|
||||
let check_has_future_compat = || {
|
||||
p.cargo(command).arg("-Zfuture-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo(command)
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains(FUTURE_OUTPUT)
|
||||
.with_stderr_contains("warning: the following packages contain code that will be rejected by a future version of Rust: foo v0.0.0 [..]")
|
||||
|
@ -147,8 +128,6 @@ frequency = 'never'
|
|||
",
|
||||
);
|
||||
p.cargo(command)
|
||||
.arg("-Zfuture-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains(FUTURE_OUTPUT)
|
||||
.with_stderr_does_not_contain("[..]rejected[..]")
|
||||
|
@ -156,8 +135,7 @@ frequency = 'never'
|
|||
.run();
|
||||
|
||||
// Check that passing `--future-incompat-report` overrides `frequency = 'never'`
|
||||
p.cargo(command).arg("-Zfuture-incompat-report").arg("-Zunstable-options").arg("--future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo(command).arg("--future-incompat-report")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains(FUTURE_OUTPUT)
|
||||
.with_stderr_contains("warning: the following packages contain code that will be rejected by a future version of Rust: foo v0.0.0 [..]")
|
||||
|
@ -197,8 +175,7 @@ fn test_multi_crate() {
|
|||
.build();
|
||||
|
||||
for command in &["build", "check", "rustc", "test"] {
|
||||
p.cargo(command).arg("-Zfuture-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo(command)
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_does_not_contain(FUTURE_OUTPUT)
|
||||
.with_stderr_contains("warning: the following packages contain code that will be rejected by a future version of Rust: first-dep v0.0.1, second-dep v0.0.2")
|
||||
|
@ -209,23 +186,20 @@ fn test_multi_crate() {
|
|||
.with_stderr_does_not_contain("[..]-p[..]")
|
||||
.run();
|
||||
|
||||
p.cargo(command).arg("-Zunstable-options").arg("-Zfuture-incompat-report").arg("--future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo(command).arg("--future-incompat-report")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains("warning: the following packages contain code that will be rejected by a future version of Rust: first-dep v0.0.1, second-dep v0.0.2")
|
||||
.with_stderr_contains(" - first-dep:0.0.1")
|
||||
.with_stderr_contains(" - second-dep:0.0.2")
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities").arg("--package").arg("first-dep:0.0.1").arg("-Zunstable-options").arg("-Zfuture-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo("report future-incompatibilities").arg("--package").arg("first-dep:0.0.1")
|
||||
.with_stdout_contains("The package `first-dep v0.0.1` currently triggers the following future incompatibility lints:")
|
||||
.with_stdout_contains(FUTURE_OUTPUT)
|
||||
.with_stdout_does_not_contain("[..]second-dep-0.0.2/src[..]")
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities").arg("--package").arg("second-dep:0.0.2").arg("-Zunstable-options").arg("-Zfuture-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo("report future-incompatibilities").arg("--package").arg("second-dep:0.0.2")
|
||||
.with_stdout_contains("The package `second-dep v0.0.2` currently triggers the following future incompatibility lints:")
|
||||
.with_stdout_contains(FUTURE_OUTPUT)
|
||||
.with_stdout_does_not_contain("[..]first-dep-0.0.1/src[..]")
|
||||
|
@ -234,9 +208,8 @@ fn test_multi_crate() {
|
|||
|
||||
// Test that passing the correct id via '--id' doesn't generate a warning message
|
||||
let output = p
|
||||
.cargo("build -Z future-incompat-report")
|
||||
.cargo("build")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.exec_with_output()
|
||||
.unwrap();
|
||||
|
||||
|
@ -256,16 +229,14 @@ fn test_multi_crate() {
|
|||
// Strip off the trailing '`' included in the output
|
||||
let id: String = id.chars().take_while(|c| *c != '`').collect();
|
||||
|
||||
p.cargo(&format!("report future-incompatibilities -Z future-incompat-report --id {}", id))
|
||||
.masquerade_as_nightly_cargo()
|
||||
p.cargo(&format!("report future-incompatibilities --id {}", id))
|
||||
.with_stdout_contains("The package `first-dep v0.0.1` currently triggers the following future incompatibility lints:")
|
||||
.with_stdout_contains("The package `second-dep v0.0.2` currently triggers the following future incompatibility lints:")
|
||||
.run();
|
||||
|
||||
// Test without --id, and also the full output of the report.
|
||||
let output = p
|
||||
.cargo("report future-incompat -Z future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.cargo("report future-incompat")
|
||||
.exec_with_output()
|
||||
.unwrap();
|
||||
let output = std::str::from_utf8(&output.stdout).unwrap();
|
||||
|
@ -305,17 +276,17 @@ fn color() {
|
|||
|
||||
let p = simple_project();
|
||||
|
||||
p.cargo("check -Zfuture-incompat-report")
|
||||
p.cargo("check")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities -Z future-incompat-report")
|
||||
p.cargo("report future-incompatibilities")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_stdout_does_not_contain("[..]\x1b[[..]")
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities -Z future-incompat-report")
|
||||
p.cargo("report future-incompatibilities")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.env("CARGO_TERM_COLOR", "always")
|
||||
.with_stdout_contains("[..]\x1b[[..]")
|
||||
|
@ -331,24 +302,24 @@ fn bad_ids() {
|
|||
|
||||
let p = simple_project();
|
||||
|
||||
p.cargo("report future-incompatibilities -Z future-incompat-report --id 1")
|
||||
p.cargo("report future-incompatibilities --id 1")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_status(101)
|
||||
.with_stderr("error: no reports are currently available")
|
||||
.run();
|
||||
|
||||
p.cargo("check -Zfuture-incompat-report")
|
||||
p.cargo("check")
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities -Z future-incompat-report --id foo")
|
||||
p.cargo("report future-incompatibilities --id foo")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_status(1)
|
||||
.with_stderr("error: Invalid value: could not parse `foo` as a number")
|
||||
.run();
|
||||
|
||||
p.cargo("report future-incompatibilities -Z future-incompat-report --id 7")
|
||||
p.cargo("report future-incompatibilities --id 7")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.with_status(101)
|
||||
.with_stderr(
|
||||
|
@ -426,7 +397,7 @@ big_update v1.0.0 has the following newer versions available: 2.0.0
|
|||
with_updates v1.0.0 has the following newer versions available: 1.0.1, 1.0.2, 3.0.1
|
||||
";
|
||||
|
||||
p.cargo("check -Zfuture-incompat-report -Zunstable-options --future-incompat-report")
|
||||
p.cargo("check --future-incompat-report")
|
||||
.masquerade_as_nightly_cargo()
|
||||
.env("RUSTFLAGS", "-Zfuture-incompat-test")
|
||||
.with_stderr_contains(update_message)
|
||||
|
|
Loading…
Reference in a new issue