Skip to content

Commit 997bf3f

Browse files
committed
Stabilize future-incompat-report
Depends on rust-lang/rust#91535
1 parent f9089fc commit 997bf3f

File tree

6 files changed

+35
-79
lines changed

6 files changed

+35
-79
lines changed

src/bin/cargo/commands/report.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::command_prelude::*;
2-
use anyhow::anyhow;
32
use cargo::core::compiler::future_incompat::{OnDiskReports, REPORT_PREAMBLE};
43
use cargo::drop_println;
54

@@ -24,9 +23,6 @@ pub fn cli() -> App {
2423
}
2524

2625
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
27-
if !config.nightly_features_allowed {
28-
return Err(anyhow!("`cargo report` can only be used on the nightly channel").into());
29-
}
3026
match args.subcommand() {
3127
("future-incompatibilities", Some(args)) => report_future_incompatibilies(config, args),
3228
(cmd, _) => panic!("unexpected command `{}`", cmd),

src/cargo/core/compiler/future_incompat.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,6 @@ pub fn save_and_display_report(
321321
bcx: &BuildContext<'_, '_>,
322322
per_package_future_incompat_reports: &[FutureIncompatReportPackage],
323323
) {
324-
if !bcx.config.cli_unstable().future_incompat_report {
325-
return;
326-
}
327324
let should_display_message = match bcx.config.future_incompat_config() {
328325
Ok(config) => config.should_display_message(),
329326
Err(e) => {

src/cargo/core/compiler/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,9 @@ fn add_error_format_and_color(cx: &Context<'_, '_>, cmd: &mut ProcessBuilder, pi
798798
// to emit a message that cargo will intercept.
799799
json.push_str(",artifacts");
800800
}
801+
// Always emit a future-incompat report, so we can report
802+
// future-incompat dependencies to the user
803+
json.push_str(",future-incompat");
801804

802805
match cx.bcx.build_config.message_format {
803806
MessageFormat::Short | MessageFormat::Json { short: true, .. } => {
@@ -1022,10 +1025,6 @@ fn build_base_args(
10221025
.env("RUSTC_BOOTSTRAP", "1");
10231026
}
10241027

1025-
if bcx.config.cli_unstable().future_incompat_report {
1026-
cmd.arg("-Z").arg("emit-future-incompat-report");
1027-
}
1028-
10291028
// Add `CARGO_BIN_` environment variables for building tests.
10301029
if unit.target.is_test() || unit.target.is_bench() {
10311030
for bin_target in unit

src/cargo/core/features.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,6 @@ unstable_cli_options!(
637637
doctest_in_workspace: bool = ("Compile doctests with paths relative to the workspace root"),
638638
doctest_xcompile: bool = ("Compile and run doctests for non-host target using runner config"),
639639
dual_proc_macros: bool = ("Build proc-macros for both the host and the target"),
640-
future_incompat_report: bool = ("Enable creation of a future-incompat report for all dependencies"),
641640
features: Option<Vec<String>> = (HIDDEN),
642641
jobserver_per_rustc: bool = (HIDDEN),
643642
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
705704
See https://doc.rust-lang.org/nightly/cargo/reference/profiles.html#custom-profiles \
706705
for more information";
707706

707+
const STABILIZED_FUTURE_INCOMPAT_REPORT: &str =
708+
"The future-incompat-report feature is now always enabled.";
709+
708710
fn deserialize_build_std<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error>
709711
where
710712
D: serde::Deserializer<'de>,
@@ -894,7 +896,9 @@ impl CliUnstable {
894896
"extra-link-arg" => stabilized_warn(k, "1.56", STABILIZED_EXTRA_LINK_ARG),
895897
"configurable-env" => stabilized_warn(k, "1.56", STABILIZED_CONFIGURABLE_ENV),
896898
"patch-in-config" => stabilized_warn(k, "1.56", STABILIZED_PATCH_IN_CONFIG),
897-
"future-incompat-report" => self.future_incompat_report = parse_empty(k, v)?,
899+
"future-incompat-report" => {
900+
stabilized_warn(k, "1.59.0", STABILIZED_FUTURE_INCOMPAT_REPORT)
901+
}
898902
_ => bail!("unknown `-Z` flag specified: {}", k),
899903
}
900904

src/cargo/util/command_prelude.rs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ pub trait AppExt: Sized {
233233
fn arg_future_incompat_report(self) -> Self {
234234
self._arg(opt(
235235
"future-incompat-report",
236-
"Outputs a future incompatibility report at the end of the build (unstable)",
236+
"Outputs a future incompatibility report at the end of the build",
237237
))
238238
}
239239
}
@@ -512,17 +512,6 @@ pub trait ArgMatchesExt {
512512
.cli_unstable()
513513
.fail_if_stable_opt("--unit-graph", 8002)?;
514514
}
515-
if build_config.future_incompat_report {
516-
config
517-
.cli_unstable()
518-
.fail_if_stable_opt("--future-incompat-report", 9241)?;
519-
520-
if !config.cli_unstable().future_incompat_report {
521-
anyhow::bail!(
522-
"Usage of `--future-incompat-report` requires `-Z future-incompat-report`"
523-
)
524-
}
525-
}
526515

527516
let opts = CompileOptions {
528517
build_config,

tests/testsuite/future_incompat_report.rs

Lines changed: 25 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,31 @@ fn simple_project() -> Project {
2525
}
2626

2727
#[cargo_test]
28-
fn no_output_on_stable() {
28+
fn output_on_stable() {
2929
if !is_nightly() {
3030
// -Zfuture-incompat-test requires nightly (permanently)
3131
return;
3232
}
3333
let p = simple_project();
3434

3535
p.cargo("check")
36-
// Even though rustc emits the report, cargo ignores it without -Z.
3736
.env("RUSTFLAGS", "-Zfuture-incompat-test")
3837
.with_stderr_contains(FUTURE_OUTPUT)
39-
.with_stderr_does_not_contain("[..]cargo report[..]")
38+
.with_stderr_contains("[..]cargo report[..]")
4039
.run();
4140
}
4241

42+
// This feature is stable, and should not be gated
4343
#[cargo_test]
44-
fn gate_future_incompat_report() {
44+
fn no_gate_future_incompat_report() {
4545
let p = simple_project();
4646

4747
p.cargo("build --future-incompat-report")
48-
.with_stderr_contains("error: the `--future-incompat-report` flag is unstable[..]")
49-
.with_status(101)
50-
.run();
51-
52-
// Both `-Z future-incompat-report` and `-Z unstable-opts` are required
53-
p.cargo("build --future-incompat-report -Z future-incompat-report")
54-
.masquerade_as_nightly_cargo()
55-
.with_stderr_contains("error: the `--future-incompat-report` flag is unstable[..]")
56-
.with_status(101)
57-
.run();
58-
59-
p.cargo("build --future-incompat-report -Z unstable-options")
60-
.masquerade_as_nightly_cargo()
61-
.with_stderr_contains(
62-
"error: Usage of `--future-incompat-report` requires `-Z future-incompat-report`",
63-
)
64-
.with_status(101)
48+
.with_status(0)
6549
.run();
6650

6751
p.cargo("report future-incompatibilities --id foo")
68-
.with_stderr_contains("error: `cargo report` can only be used on the nightly channel")
52+
.with_stderr_contains("error: no reports are currently available")
6953
.with_status(101)
7054
.run();
7155
}
@@ -83,8 +67,7 @@ fn test_zero_future_incompat() {
8367
.build();
8468

8569
// No note if --future-incompat-report is not specified.
86-
p.cargo("build -Z future-incompat-report")
87-
.masquerade_as_nightly_cargo()
70+
p.cargo("build")
8871
.env("RUSTFLAGS", "-Zfuture-incompat-test")
8972
.with_stderr(
9073
"\
@@ -94,8 +77,7 @@ fn test_zero_future_incompat() {
9477
)
9578
.run();
9679

97-
p.cargo("build --future-incompat-report -Z unstable-options -Z future-incompat-report")
98-
.masquerade_as_nightly_cargo()
80+
p.cargo("build --future-incompat-report")
9981
.env("RUSTFLAGS", "-Zfuture-incompat-test")
10082
.with_stderr(
10183
"\
@@ -117,8 +99,7 @@ fn test_single_crate() {
11799

118100
for command in &["build", "check", "rustc", "test"] {
119101
let check_has_future_compat = || {
120-
p.cargo(command).arg("-Zfuture-incompat-report")
121-
.masquerade_as_nightly_cargo()
102+
p.cargo(command)
122103
.env("RUSTFLAGS", "-Zfuture-incompat-test")
123104
.with_stderr_contains(FUTURE_OUTPUT)
124105
.with_stderr_contains("warning: the following packages contain code that will be rejected by a future version of Rust: foo v0.0.0 [..]")
@@ -147,17 +128,14 @@ frequency = 'never'
147128
",
148129
);
149130
p.cargo(command)
150-
.arg("-Zfuture-incompat-report")
151-
.masquerade_as_nightly_cargo()
152131
.env("RUSTFLAGS", "-Zfuture-incompat-test")
153132
.with_stderr_contains(FUTURE_OUTPUT)
154133
.with_stderr_does_not_contain("[..]rejected[..]")
155134
.with_stderr_does_not_contain("[..]incompatibility[..]")
156135
.run();
157136

158137
// Check that passing `--future-incompat-report` overrides `frequency = 'never'`
159-
p.cargo(command).arg("-Zfuture-incompat-report").arg("-Zunstable-options").arg("--future-incompat-report")
160-
.masquerade_as_nightly_cargo()
138+
p.cargo(command).arg("--future-incompat-report")
161139
.env("RUSTFLAGS", "-Zfuture-incompat-test")
162140
.with_stderr_contains(FUTURE_OUTPUT)
163141
.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() {
197175
.build();
198176

199177
for command in &["build", "check", "rustc", "test"] {
200-
p.cargo(command).arg("-Zfuture-incompat-report")
201-
.masquerade_as_nightly_cargo()
178+
p.cargo(command)
202179
.env("RUSTFLAGS", "-Zfuture-incompat-test")
203180
.with_stderr_does_not_contain(FUTURE_OUTPUT)
204181
.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() {
209186
.with_stderr_does_not_contain("[..]-p[..]")
210187
.run();
211188

212-
p.cargo(command).arg("-Zunstable-options").arg("-Zfuture-incompat-report").arg("--future-incompat-report")
213-
.masquerade_as_nightly_cargo()
189+
p.cargo(command).arg("--future-incompat-report")
214190
.env("RUSTFLAGS", "-Zfuture-incompat-test")
215191
.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")
216192
.with_stderr_contains(" - first-dep:0.0.1")
217193
.with_stderr_contains(" - second-dep:0.0.2")
218194
.run();
219195

220-
p.cargo("report future-incompatibilities").arg("--package").arg("first-dep:0.0.1").arg("-Zunstable-options").arg("-Zfuture-incompat-report")
221-
.masquerade_as_nightly_cargo()
196+
p.cargo("report future-incompatibilities").arg("--package").arg("first-dep:0.0.1")
222197
.with_stdout_contains("The package `first-dep v0.0.1` currently triggers the following future incompatibility lints:")
223198
.with_stdout_contains(FUTURE_OUTPUT)
224199
.with_stdout_does_not_contain("[..]second-dep-0.0.2/src[..]")
225200
.run();
226201

227-
p.cargo("report future-incompatibilities").arg("--package").arg("second-dep:0.0.2").arg("-Zunstable-options").arg("-Zfuture-incompat-report")
228-
.masquerade_as_nightly_cargo()
202+
p.cargo("report future-incompatibilities").arg("--package").arg("second-dep:0.0.2")
229203
.with_stdout_contains("The package `second-dep v0.0.2` currently triggers the following future incompatibility lints:")
230204
.with_stdout_contains(FUTURE_OUTPUT)
231205
.with_stdout_does_not_contain("[..]first-dep-0.0.1/src[..]")
@@ -234,9 +208,8 @@ fn test_multi_crate() {
234208

235209
// Test that passing the correct id via '--id' doesn't generate a warning message
236210
let output = p
237-
.cargo("build -Z future-incompat-report")
211+
.cargo("build")
238212
.env("RUSTFLAGS", "-Zfuture-incompat-test")
239-
.masquerade_as_nightly_cargo()
240213
.exec_with_output()
241214
.unwrap();
242215

@@ -256,16 +229,14 @@ fn test_multi_crate() {
256229
// Strip off the trailing '`' included in the output
257230
let id: String = id.chars().take_while(|c| *c != '`').collect();
258231

259-
p.cargo(&format!("report future-incompatibilities -Z future-incompat-report --id {}", id))
260-
.masquerade_as_nightly_cargo()
232+
p.cargo(&format!("report future-incompatibilities --id {}", id))
261233
.with_stdout_contains("The package `first-dep v0.0.1` currently triggers the following future incompatibility lints:")
262234
.with_stdout_contains("The package `second-dep v0.0.2` currently triggers the following future incompatibility lints:")
263235
.run();
264236

265237
// Test without --id, and also the full output of the report.
266238
let output = p
267-
.cargo("report future-incompat -Z future-incompat-report")
268-
.masquerade_as_nightly_cargo()
239+
.cargo("report future-incompat")
269240
.exec_with_output()
270241
.unwrap();
271242
let output = std::str::from_utf8(&output.stdout).unwrap();
@@ -305,17 +276,17 @@ fn color() {
305276

306277
let p = simple_project();
307278

308-
p.cargo("check -Zfuture-incompat-report")
279+
p.cargo("check")
309280
.env("RUSTFLAGS", "-Zfuture-incompat-test")
310281
.masquerade_as_nightly_cargo()
311282
.run();
312283

313-
p.cargo("report future-incompatibilities -Z future-incompat-report")
284+
p.cargo("report future-incompatibilities")
314285
.masquerade_as_nightly_cargo()
315286
.with_stdout_does_not_contain("[..]\x1b[[..]")
316287
.run();
317288

318-
p.cargo("report future-incompatibilities -Z future-incompat-report")
289+
p.cargo("report future-incompatibilities")
319290
.masquerade_as_nightly_cargo()
320291
.env("CARGO_TERM_COLOR", "always")
321292
.with_stdout_contains("[..]\x1b[[..]")
@@ -331,24 +302,24 @@ fn bad_ids() {
331302

332303
let p = simple_project();
333304

334-
p.cargo("report future-incompatibilities -Z future-incompat-report --id 1")
305+
p.cargo("report future-incompatibilities --id 1")
335306
.masquerade_as_nightly_cargo()
336307
.with_status(101)
337308
.with_stderr("error: no reports are currently available")
338309
.run();
339310

340-
p.cargo("check -Zfuture-incompat-report")
311+
p.cargo("check")
341312
.env("RUSTFLAGS", "-Zfuture-incompat-test")
342313
.masquerade_as_nightly_cargo()
343314
.run();
344315

345-
p.cargo("report future-incompatibilities -Z future-incompat-report --id foo")
316+
p.cargo("report future-incompatibilities --id foo")
346317
.masquerade_as_nightly_cargo()
347318
.with_status(1)
348319
.with_stderr("error: Invalid value: could not parse `foo` as a number")
349320
.run();
350321

351-
p.cargo("report future-incompatibilities -Z future-incompat-report --id 7")
322+
p.cargo("report future-incompatibilities --id 7")
352323
.masquerade_as_nightly_cargo()
353324
.with_status(101)
354325
.with_stderr(
@@ -426,7 +397,7 @@ big_update v1.0.0 has the following newer versions available: 2.0.0
426397
with_updates v1.0.0 has the following newer versions available: 1.0.1, 1.0.2, 3.0.1
427398
";
428399

429-
p.cargo("check -Zfuture-incompat-report -Zunstable-options --future-incompat-report")
400+
p.cargo("check --future-incompat-report")
430401
.masquerade_as_nightly_cargo()
431402
.env("RUSTFLAGS", "-Zfuture-incompat-test")
432403
.with_stderr_contains(update_message)

0 commit comments

Comments
 (0)