From 58d1d91686cb6cae7cd641ae02bc889a973838a8 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 5 Sep 2023 15:40:30 -0500 Subject: [PATCH] feat: Add `--rust-version` flag Fixes #196 --- README.md | 5 +++++ src/cli.rs | 37 ++++++++++++++++++++++++++++++++----- src/version.rs | 6 ++++++ tests/auxiliary/mod.rs | 5 ++++- tests/long-help.txt | 5 +++++ tests/short-help.txt | 1 + tests/test.rs | 10 ++++++++++ 7 files changed, 63 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 97aa46c0..98058178 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,11 @@ OPTIONS: This flag can only be used together with either --features or --include-features. + --rust-version + Perform commands on `package.rust-version`. + + This cannot be used with --version-range. + --version-range [START]..[=END] Perform commands on a specified (inclusive) range of Rust versions. diff --git a/src/cli.rs b/src/cli.rs index 6e0d08b1..825b116b 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -149,6 +149,7 @@ impl Args { let mut keep_going = false; let mut print_command_list = false; let mut no_manifest_path = false; + let mut rust_version = false; let mut version_range = None; let mut version_step = None; @@ -236,6 +237,7 @@ impl Args { Long("manifest-path") => parse_opt!(manifest_path, false), Long("depth") => parse_opt!(depth, false), + Long("rust-version") => parse_flag!(rust_version), Long("version-range") => parse_opt!(version_range, false), Long("version-step") => parse_opt!(version_step, false), @@ -507,11 +509,28 @@ impl Args { } } - if version_range.is_some() { - let rustup = Rustup::new(); - if rustup.version < 23 { - bail!("--version-range requires rustup 1.23 or later"); + let version_range = match (version_range, rust_version) { + (Some(_), true) => { + conflicts("--version-range", "--rust-version")?; + unreachable!() + } + (Some(version_range), false) => { + let rustup = Rustup::new(); + if rustup.version < 23 { + bail!("--version-range requires rustup 1.23 or later"); + } + Some(version_range.parse()?) } + (None, true) => { + let rustup = Rustup::new(); + if rustup.version < 23 { + bail!("--rust-version requires rustup 1.23 or later"); + } + Some(VersionRange::msrv()) + } + (None, false) => None, + }; + if version_range.is_some() { } else { if version_step.is_some() { requires("--version-step", &["--version-range"])?; @@ -520,7 +539,6 @@ impl Args { requires("--clean-per-version", &["--version-range"])?; } } - let version_range = version_range.map(|v| v.parse()).transpose()?; if no_dev_deps { info!( @@ -728,6 +746,15 @@ const HELP: &[HelpText<'_>] = &[ "Skip passing --features flag to `cargo` if that feature does not exist in the package", &["This flag can only be used together with either --features or --include-features."], ), + ( + "", + "--rust-version", + "", + "Perform commands on `package.rust-version`", + &[ + "This cannot be used with --version-range.", + ], + ), ( "", "--version-range", diff --git a/src/version.rs b/src/version.rs index 74604d99..6593febf 100644 --- a/src/version.rs +++ b/src/version.rs @@ -46,6 +46,12 @@ pub(crate) struct VersionRange { pub(crate) end_inclusive: MaybeVersion, } +impl VersionRange { + pub(crate) fn msrv() -> Self { + Self { start_inclusive: MaybeVersion::Msrv, end_inclusive: MaybeVersion::Msrv } + } +} + impl fmt::Display for VersionRange { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let MaybeVersion::Version(start) = self.start_inclusive { diff --git a/tests/auxiliary/mod.rs b/tests/auxiliary/mod.rs index 14ef8373..5e222051 100644 --- a/tests/auxiliary/mod.rs +++ b/tests/auxiliary/mod.rs @@ -61,7 +61,10 @@ pub fn cargo_hack>(args: impl AsRef<[O]>) -> Command { let mut cmd = cargo_bin_exe(); cmd.arg("hack"); if let Some(toolchain) = test_version() { - if !args.iter().any(|a| a.as_ref().to_str().unwrap().starts_with("--version-range")) { + if !args.iter().any(|a| { + let s = a.as_ref().to_str().unwrap(); + s.starts_with("--version-range") || s.starts_with("--rust-version") + }) { cmd.arg(format!("--version-range=1.{toolchain}..=1.{toolchain}")); } } diff --git a/tests/long-help.txt b/tests/long-help.txt index 1367690b..f1ef3fdf 100644 --- a/tests/long-help.txt +++ b/tests/long-help.txt @@ -134,6 +134,11 @@ OPTIONS: This flag can only be used together with either --features or --include-features. + --rust-version + Perform commands on `package.rust-version`. + + This cannot be used with --version-range. + --version-range [START]..[=END] Perform commands on a specified (inclusive) range of Rust versions. diff --git a/tests/short-help.txt b/tests/short-help.txt index d8279321..2296dd11 100644 --- a/tests/short-help.txt +++ b/tests/short-help.txt @@ -34,6 +34,7 @@ OPTIONS: --ignore-private Skip to perform on `publish = false` packages --ignore-unknown-features Skip passing --features flag to `cargo` if that feature does not exist in the package + --rust-version Perform commands on `package.rust-version` --version-range [START]..[=END] Perform commands on a specified (inclusive) range of Rust versions --version-step Specify the version interval of --version-range (default diff --git a/tests/test.rs b/tests/test.rs index 25bc9616..77674845 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1353,6 +1353,16 @@ fn version_range() { ); } +#[cfg_attr(windows, ignore)] // rustup bug: https://github.com/rust-lang/rustup/issues/3036 +#[test] +fn rust_version() { + cargo_hack(["check", "--rust-version"]).assert_success("rust-version").stderr_contains( + " + running `cargo +1.64 check` on real (1/1) + ", + ); +} + #[cfg_attr(windows, ignore)] // rustup bug: https://github.com/rust-lang/rustup/issues/3036 #[test] fn multi_target() {