From 5d8022c9e82490347a732834809106bdf8777616 Mon Sep 17 00:00:00 2001 From: heisen-li Date: Wed, 5 Jun 2024 15:36:06 +0800 Subject: [PATCH] Use clap's conflict support and keep some command tests --- src/bin/cargo/commands/install.rs | 11 +++-- src/cargo/util/command_prelude.rs | 21 +++------ tests/testsuite/check.rs | 18 +++++--- tests/testsuite/profile_custom.rs | 75 ++++++------------------------- 4 files changed, 40 insertions(+), 85 deletions(-) diff --git a/src/bin/cargo/commands/install.rs b/src/bin/cargo/commands/install.rs index 79e39c163f7..8aaaeb87b0e 100644 --- a/src/bin/cargo/commands/install.rs +++ b/src/bin/cargo/commands/install.rs @@ -85,10 +85,13 @@ pub fn cli() -> Command { ) .arg_features() .arg_parallel() - .arg(flag( - "debug", - "Build in debug mode (with the 'dev' profile) instead of release mode", - )) + .arg( + flag( + "debug", + "Build in debug mode (with the 'dev' profile) instead of release mode", + ) + .conflicts_with("profile"), + ) .arg_redundant_default_mode("release", "install", "debug") .arg_profile("Install artifacts with the specified profile") .arg_target_triple("Build for the target triple") diff --git a/src/cargo/util/command_prelude.rs b/src/cargo/util/command_prelude.rs index 11164b8409c..f40dc85ac67 100644 --- a/src/cargo/util/command_prelude.rs +++ b/src/cargo/util/command_prelude.rs @@ -131,7 +131,12 @@ pub trait CommandExt: Sized { ) -> Self { let msg = format!("`--{default_mode}` is the default for `cargo {command}`; instead `--{supported_mode}` is supported"); let value_parser = UnknownArgumentValueParser::suggest(msg); - self._arg(flag(default_mode, "").value_parser(value_parser).hide(true)) + self._arg( + flag(default_mode, "") + .conflicts_with("profile") + .value_parser(value_parser) + .hide(true), + ) } fn arg_targets_all( @@ -226,6 +231,7 @@ pub trait CommandExt: Sized { self._arg( flag("release", release) .short('r') + .conflicts_with("profile") .help_heading(heading::COMPILATION_OPTIONS), ) } @@ -563,14 +569,6 @@ Run `{cmd}` to see possible targets." ) -> CargoResult { let specified_profile = self._value_of("profile"); - let err_message = |flag: &str| { - format!( - "\ -the `--{flag}` flag can not be specified with the `--profile` flag -Please remove one of the flags." - ) - }; - // Check for allowed legacy names. // This is an early exit, since it allows combination with `--release`. match (specified_profile, profile_checking) { @@ -578,9 +576,6 @@ Please remove one of the flags." (Some(name @ ("dev" | "test" | "bench" | "check")), ProfileChecking::LegacyRustc) // `cargo fix` and `cargo check` has legacy handling of this profile name | (Some(name @ "test"), ProfileChecking::LegacyTestOnly) => { - if self.maybe_flag("release") { - bail!(err_message("release")); - } return Ok(InternedString::new(name)); } _ => {} @@ -593,9 +588,7 @@ Please remove one of the flags." ) { (false, false, None) => default, (true, _, None) => "release", - (true, _, Some(_)) => bail!(err_message("release")), (_, true, None) => "dev", - (_, true, Some(_)) => bail!(err_message("debug")), // `doc` is separate from all the other reservations because // [profile.doc] was historically allowed, but is deprecated and // has no effect. To avoid potentially breaking projects, it is a diff --git a/tests/testsuite/check.rs b/tests/testsuite/check.rs index ab135c7cb21..54e11f5d74e 100644 --- a/tests/testsuite/check.rs +++ b/tests/testsuite/check.rs @@ -289,20 +289,26 @@ fn rustc_check() { // Verify compatible usage of --profile with --release, issue #7488 foo.cargo("rustc --profile check --release -- --emit=metadata") - .with_status(101) + .with_status(1) .with_stderr( "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", +[ERROR] the argument '--profile ' cannot be used with '--release' + +Usage: cargo[EXE] rustc --profile [ARGS]... + +For more information, try '--help'.", ) .run(); foo.cargo("rustc --profile test --release -- --emit=metadata") - .with_status(101) + .with_status(1) .with_stderr( "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", +[ERROR] the argument '--profile ' cannot be used with '--release' + +Usage: cargo[EXE] rustc --profile [ARGS]... + +For more information, try '--help'.", ) .run(); } diff --git a/tests/testsuite/profile_custom.rs b/tests/testsuite/profile_custom.rs index 22481fabdeb..d879507d0ca 100644 --- a/tests/testsuite/profile_custom.rs +++ b/tests/testsuite/profile_custom.rs @@ -380,85 +380,38 @@ fn conflicting_usage() { .build(); p.cargo("build --profile=dev --release") - .with_status(101) + .with_status(1) .with_stderr( "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +[ERROR] the argument '--profile ' cannot be used with '--release' - p.cargo("install --profile=release --debug") - .with_status(101) - .with_stderr( - "\ -error: the `--debug` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +Usage: cargo[EXE] build --profile - p.cargo("rustc --profile=dev --release") - .with_status(101) - .with_stderr( - "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags. -", +For more information, try '--help'.", ) .run(); - p.cargo("check --profile=dev --release") - .with_status(101) + p.cargo("install --profile=release --debug") + .with_status(1) .with_stderr( "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +[ERROR] the argument '--profile ' cannot be used with '--debug' - p.cargo("check --profile=test --release") - .with_status(101) - .with_stderr( - "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +Usage: cargo[EXE] install --profile [CRATE[@]]... - // This is OK since the two are the same. - p.cargo("rustc --profile=release --release") - .with_status(101) - .with_stderr( - "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", +For more information, try '--help'.", ) .run(); - p.cargo("build --profile=release --release") - .with_status(101) + p.cargo("check --profile=dev --release") + .with_status(1) .with_stderr( "\ -error: the `--release` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +[ERROR] the argument '--profile ' cannot be used with '--release' - p.cargo("install --path . --profile=dev --debug") - .with_status(101) - .with_stderr( - "\ -error: the `--debug` flag can not be specified with the `--profile` flag -Please remove one of the flags.", - ) - .run(); +Usage: cargo[EXE] check --profile - p.cargo("install --path . --profile=release --debug") - .with_status(101) - .with_stderr( - "\ -error: the `--debug` flag can not be specified with the `--profile` flag -Please remove one of the flags.", +For more information, try '--help'.", ) .run(); }