From 7d7fe6797ad07f313706380d251796702272b150 Mon Sep 17 00:00:00 2001
From: Eric Huss
Date: Fri, 21 Jun 2019 11:36:53 -0700
Subject: [PATCH] Stabilize default-run
---
src/bin/cargo/main.rs | 25 ++-----
src/cargo/core/features.rs | 2 +-
src/cargo/core/manifest.rs | 6 --
src/cargo/core/package.rs | 17 +----
src/cargo/core/profiles.rs | 26 ++-----
src/cargo/ops/cargo_compile.rs | 34 ++++-----
src/cargo/ops/cargo_run.rs | 25 +++----
src/cargo/util/command_prelude.rs | 6 +-
src/cargo/util/lev_distance.rs | 28 ++++++++
src/cargo/util/mod.rs | 2 +-
src/cargo/util/toml/mod.rs | 15 +++-
src/doc/man/cargo-run.adoc | 3 +-
src/doc/man/generated/cargo-run.html | 3 +-
src/doc/src/reference/manifest.md | 32 ++++++---
src/doc/src/reference/unstable.md | 12 ----
src/etc/man/cargo-run.1 | 7 +-
tests/testsuite/build.rs | 6 +-
tests/testsuite/profile_overrides.rs | 2 +-
tests/testsuite/required_features.rs | 4 +-
tests/testsuite/run.rs | 101 ++++-----------------------
20 files changed, 131 insertions(+), 225 deletions(-)
diff --git a/src/bin/cargo/main.rs b/src/bin/cargo/main.rs
index 02f77d99a..9ed135cf1 100644
--- a/src/bin/cargo/main.rs
+++ b/src/bin/cargo/main.rs
@@ -10,7 +10,7 @@ use std::fs;
use std::path::{Path, PathBuf};
use cargo::core::shell::Shell;
-use cargo::util::{self, command_prelude, lev_distance, CargoResult, CliResult, Config};
+use cargo::util::{self, closest_msg, command_prelude, CargoResult, CliResult, Config};
use cargo::util::{CliError, ProcessError};
mod cli;
@@ -113,18 +113,6 @@ fn list_commands(config: &Config) -> BTreeSet {
commands
}
-fn find_closest(config: &Config, cmd: &str) -> Option {
- let cmds = list_commands(config);
- // Only consider candidates with a lev_distance of 3 or less so we don't
- // suggest out-of-the-blue options.
- cmds.into_iter()
- .map(|c| c.name())
- .map(|c| (lev_distance(&c, cmd), c))
- .filter(|&(d, _)| d < 4)
- .min_by_key(|a| a.0)
- .map(|slot| slot.1)
-}
-
fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&str]) -> CliResult {
let command_exe = format!("cargo-{}{}", cmd, env::consts::EXE_SUFFIX);
let path = search_directories(config)
@@ -134,14 +122,9 @@ fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&str]) -> Cli
let command = match path {
Some(command) => command,
None => {
- let err = match find_closest(config, cmd) {
- Some(closest) => failure::format_err!(
- "no such subcommand: `{}`\n\n\tDid you mean `{}`?\n",
- cmd,
- closest
- ),
- None => failure::format_err!("no such subcommand: `{}`", cmd),
- };
+ let cmds = list_commands(config);
+ let did_you_mean = closest_msg(cmd, cmds.iter(), |c| c.name());
+ let err = failure::format_err!("no such subcommand: `{}`{}", cmd, did_you_mean);
return Err(CliError::new(err, 101));
}
};
diff --git a/src/cargo/core/features.rs b/src/cargo/core/features.rs
index 1670e05ae..b7f9d39d4 100644
--- a/src/cargo/core/features.rs
+++ b/src/cargo/core/features.rs
@@ -196,7 +196,7 @@ features! {
[unstable] namespaced_features: bool,
// "default-run" manifest option,
- [unstable] default_run: bool,
+ [stable] default_run: bool,
// Declarative build scripts.
[unstable] metabuild: bool,
diff --git a/src/cargo/core/manifest.rs b/src/cargo/core/manifest.rs
index 44fae99ec..2c57c9e4a 100644
--- a/src/cargo/core/manifest.rs
+++ b/src/cargo/core/manifest.rs
@@ -518,12 +518,6 @@ impl Manifest {
})?;
}
- if self.default_run.is_some() {
- self.features
- .require(Feature::default_run())
- .chain_err(|| failure::format_err!("the `default-run` manifest key is unstable"))?;
- }
-
Ok(())
}
diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs
index b63a6d233..0c089b901 100644
--- a/src/cargo/core/package.rs
+++ b/src/cargo/core/package.rs
@@ -25,7 +25,7 @@ use crate::ops;
use crate::util::config::PackageCacheLock;
use crate::util::errors::{CargoResult, CargoResultExt, HttpNot200};
use crate::util::network::Retry;
-use crate::util::{self, internal, lev_distance, Config, Progress, ProgressStyle};
+use crate::util::{self, internal, Config, Progress, ProgressStyle};
/// Information about a package that is available somewhere in the file system.
///
@@ -193,21 +193,6 @@ impl Package {
self.targets().iter().any(|t| t.is_custom_build())
}
- pub fn find_closest_target(
- &self,
- target: &str,
- is_expected_kind: fn(&Target) -> bool,
- ) -> Option<&Target> {
- let targets = self.targets();
-
- let matches = targets
- .iter()
- .filter(|t| is_expected_kind(t))
- .map(|t| (lev_distance(target, t.name()), t))
- .filter(|&(d, _)| d < 4);
- matches.min_by_key(|t| t.0).map(|t| t.1)
- }
-
pub fn map_source(self, to_replace: SourceId, replace_with: SourceId) -> Package {
Package {
manifest: self.manifest.map_source(to_replace, replace_with),
diff --git a/src/cargo/core/profiles.rs b/src/cargo/core/profiles.rs
index 80b4fa6a6..c20b5800a 100644
--- a/src/cargo/core/profiles.rs
+++ b/src/cargo/core/profiles.rs
@@ -7,9 +7,8 @@ use crate::core::compiler::CompileMode;
use crate::core::interning::InternedString;
use crate::core::{Features, PackageId, PackageIdSpec, PackageSet, Shell};
use crate::util::errors::CargoResultExt;
-use crate::util::lev_distance::lev_distance;
use crate::util::toml::{ProfilePackageSpec, StringOrBool, TomlProfile, TomlProfiles, U32OrBool};
-use crate::util::{CargoResult, Config};
+use crate::util::{closest_msg, CargoResult, Config};
/// Collection of all user profiles.
#[derive(Clone, Debug)]
@@ -290,23 +289,12 @@ impl ProfileMaker {
})
.collect();
if name_matches.is_empty() {
- let suggestion = packages
- .package_ids()
- .map(|p| (lev_distance(&*spec.name(), &p.name()), p.name()))
- .filter(|&(d, _)| d < 4)
- .min_by_key(|p| p.0)
- .map(|p| p.1);
- match suggestion {
- Some(p) => shell.warn(format!(
- "profile override spec `{}` did not match any packages\n\n\
- Did you mean `{}`?",
- spec, p
- ))?,
- None => shell.warn(format!(
- "profile override spec `{}` did not match any packages",
- spec
- ))?,
- }
+ let suggestion =
+ closest_msg(&spec.name(), packages.package_ids(), |p| p.name().as_str());
+ shell.warn(format!(
+ "profile override spec `{}` did not match any packages{}",
+ spec, suggestion
+ ))?;
} else {
shell.warn(format!(
"version or URL in profile override spec `{}` does not \
diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs
index 7db7b762f..826c3472e 100644
--- a/src/cargo/ops/cargo_compile.rs
+++ b/src/cargo/ops/cargo_compile.rs
@@ -35,7 +35,7 @@ use crate::core::{Package, Target};
use crate::core::{PackageId, PackageIdSpec, TargetKind, Workspace};
use crate::ops;
use crate::util::config::Config;
-use crate::util::{lev_distance, profile, CargoResult};
+use crate::util::{closest_msg, profile, CargoResult};
/// Contains information about how a package should be compiled.
#[derive(Debug)]
@@ -906,26 +906,18 @@ fn find_named_targets<'a>(
let filter = |t: &Target| t.name() == target_name && is_expected_kind(t);
let proposals = filter_targets(packages, filter, true, mode);
if proposals.is_empty() {
- let suggestion = packages
- .iter()
- .flat_map(|pkg| {
- pkg.targets()
- .iter()
- .filter(|target| is_expected_kind(target))
- })
- .map(|target| (lev_distance(target_name, target.name()), target))
- .filter(|&(d, _)| d < 4)
- .min_by_key(|t| t.0)
- .map(|t| t.1);
- match suggestion {
- Some(s) => failure::bail!(
- "no {} target named `{}`\n\nDid you mean `{}`?",
- target_desc,
- target_name,
- s.name()
- ),
- None => failure::bail!("no {} target named `{}`", target_desc, target_name),
- }
+ let targets = packages.iter().flat_map(|pkg| {
+ pkg.targets()
+ .iter()
+ .filter(|target| is_expected_kind(target))
+ });
+ let suggestion = closest_msg(target_name, targets, |t| t.name());
+ failure::bail!(
+ "no {} target named `{}`{}",
+ target_desc,
+ target_name,
+ suggestion
+ );
}
Ok(proposals)
}
diff --git a/src/cargo/ops/cargo_run.rs b/src/cargo/ops/cargo_run.rs
index 7fc992115..f9fb3cd17 100644
--- a/src/cargo/ops/cargo_run.rs
+++ b/src/cargo/ops/cargo_run.rs
@@ -2,7 +2,7 @@ use std::ffi::OsString;
use std::iter;
use std::path::Path;
-use crate::core::{nightly_features_allowed, TargetKind, Workspace};
+use crate::core::{TargetKind, Workspace};
use crate::ops;
use crate::util::{CargoResult, ProcessError};
@@ -55,22 +55,13 @@ pub fn run(
.into_iter()
.map(|(_pkg, target)| target.name())
.collect();
- if nightly_features_allowed() {
- failure::bail!(
- "`cargo run` could not determine which binary to run. \
- Use the `--bin` option to specify a binary, \
- or (on nightly) the `default-run` manifest key.\n\
- available binaries: {}",
- names.join(", ")
- )
- } else {
- failure::bail!(
- "`cargo run` requires that a package only have one \
- executable; use the `--bin` option to specify which one \
- to run\navailable binaries: {}",
- names.join(", ")
- )
- }
+ failure::bail!(
+ "`cargo run` could not determine which binary to run. \
+ Use the `--bin` option to specify a binary, \
+ or the `default-run` manifest key.\n\
+ available binaries: {}",
+ names.join(", ")
+ )
} else {
failure::bail!(
"`cargo run` can run at most one executable, but \
diff --git a/src/cargo/util/command_prelude.rs b/src/cargo/util/command_prelude.rs
index 8d6963c6d..b8f208ea3 100644
--- a/src/cargo/util/command_prelude.rs
+++ b/src/cargo/util/command_prelude.rs
@@ -514,10 +514,10 @@ pub enum CommandInfo {
}
impl CommandInfo {
- pub fn name(&self) -> String {
+ pub fn name(&self) -> &str {
match self {
- CommandInfo::BuiltIn { name, .. } => name.to_string(),
- CommandInfo::External { name, .. } => name.to_string(),
+ CommandInfo::BuiltIn { name, .. } => &name,
+ CommandInfo::External { name, .. } => &name,
}
}
}
diff --git a/src/cargo/util/lev_distance.rs b/src/cargo/util/lev_distance.rs
index 034fb7287..db78e13b6 100644
--- a/src/cargo/util/lev_distance.rs
+++ b/src/cargo/util/lev_distance.rs
@@ -33,6 +33,34 @@ pub fn lev_distance(me: &str, t: &str) -> usize {
dcol[t_last + 1]
}
+/// Find the closest element from `iter` matching `choice`. The `key` callback
+/// is used to select a `&str` from the iterator to compare against `choice`.
+pub fn closest<'a, T>(
+ choice: &str,
+ iter: impl Iterator- ,
+ key: impl Fn(&T) -> &'a str,
+) -> Option {
+ // Only consider candidates with a lev_distance of 3 or less so we don't
+ // suggest out-of-the-blue options.
+ iter.map(|e| (lev_distance(choice, key(&e)), e))
+ .filter(|&(d, _)| d < 4)
+ .min_by_key(|t| t.0)
+ .map(|t| t.1)
+}
+
+/// Version of `closest` that returns a common "suggestion" that can be tacked
+/// onto the end of an error message.
+pub fn closest_msg<'a, T>(
+ choice: &str,
+ iter: impl Iterator
- ,
+ key: impl Fn(&T) -> &'a str,
+) -> String {
+ match closest(choice, iter, &key) {
+ Some(e) => format!("\n\n\tDid you mean `{}`?", key(&e)),
+ None => String::new(),
+ }
+}
+
#[test]
fn test_lev_distance() {
use std::char::{from_u32, MAX};
diff --git a/src/cargo/util/mod.rs b/src/cargo/util/mod.rs
index b7b202d25..a8806f577 100644
--- a/src/cargo/util/mod.rs
+++ b/src/cargo/util/mod.rs
@@ -12,7 +12,7 @@ pub use self::graph::Graph;
pub use self::hex::{hash_u64, short_hash, to_hex};
pub use self::into_url::IntoUrl;
pub use self::into_url_with_base::IntoUrlWithBase;
-pub use self::lev_distance::lev_distance;
+pub use self::lev_distance::{closest, closest_msg, lev_distance};
pub use self::lockserver::{LockServer, LockServerClient, LockServerStarted};
pub use self::paths::{bytes2path, dylib_path, join_paths, path2bytes};
pub use self::paths::{dylib_path_envvar, normalize_path};
diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs
index 528536210..29f02a1ff 100644
--- a/src/cargo/util/toml/mod.rs
+++ b/src/cargo/util/toml/mod.rs
@@ -21,8 +21,7 @@ use crate::core::{Edition, EitherManifest, Feature, Features, VirtualManifest};
use crate::core::{GitReference, PackageIdSpec, SourceId, WorkspaceConfig, WorkspaceRootConfig};
use crate::sources::{CRATES_IO_INDEX, CRATES_IO_REGISTRY};
use crate::util::errors::{CargoResult, CargoResultExt, ManifestError};
-use crate::util::paths;
-use crate::util::{self, validate_package_name, Config, IntoUrl};
+use crate::util::{self, paths, validate_package_name, Config, IntoUrl};
mod targets;
use self::targets::targets;
@@ -1052,6 +1051,18 @@ impl TomlManifest {
)
}
+ if let Some(run) = &project.default_run {
+ if !targets
+ .iter()
+ .filter(|t| t.is_bin())
+ .any(|t| t.name() == run)
+ {
+ let suggestion =
+ util::closest_msg(&run, targets.iter().filter(|t| t.is_bin()), |t| t.name());
+ bail!("default-run target `{}` not found{}", run, suggestion);
+ }
+ }
+
let custom_metadata = project.metadata.clone();
let mut manifest = Manifest::new(
summary,
diff --git a/src/doc/man/cargo-run.adoc b/src/doc/man/cargo-run.adoc
index 21bec850c..8aa64e757 100644
--- a/src/doc/man/cargo-run.adoc
+++ b/src/doc/man/cargo-run.adoc
@@ -29,7 +29,8 @@ include::options-package.adoc[]
When no target selection options are given, `cargo run` will run the binary
target. If there are multiple binary targets, you must pass a target flag to
-choose one.
+choose one. Or, the `default-run` field may be specified in the `[package]`
+section of `Cargo.toml` to choose the name of the binary to run by default.
*--bin* _NAME_::
Run the specified binary.
diff --git a/src/doc/man/generated/cargo-run.html b/src/doc/man/generated/cargo-run.html
index 4a494fb7d..cbcb07c18 100644
--- a/src/doc/man/generated/cargo-run.html
+++ b/src/doc/man/generated/cargo-run.html
@@ -48,7 +48,8 @@ the SPEC format.
When no target selection options are given, cargo run
will run the binary
target. If there are multiple binary targets, you must pass a target flag to
-choose one.
+choose one. Or, the
default-run
field may be specified in the
[package]
+section of
Cargo.toml
to choose the name of the binary to run by default.
diff --git a/src/doc/src/reference/manifest.md b/src/doc/src/reference/manifest.md
index 3daf356b6..9fc641584 100644
--- a/src/doc/src/reference/manifest.md
+++ b/src/doc/src/reference/manifest.md
@@ -21,7 +21,7 @@ when listed as a dependency in another package, and as the default name of
inferred lib and bin targets.
The name must not be empty, use only [alphanumeric] characters or `-` or `_`.
-Note that `cargo new` and `cargo init` impose some additional restrictions on
+Note that [`cargo new`] and [`cargo init`] impose some additional restrictions on
the package name, such as enforcing that it is a valid Rust identifier and not
a keyword. [crates.io][cratesio] imposes even more restrictions, such as
enforcing only ASCII characters, not a reserved name, not a special Windows
@@ -66,7 +66,7 @@ edition = '2018'
```
The `edition` key affects which edition your package is compiled with. Cargo
-will always generate packages via `cargo new` with the `edition` key set to the
+will always generate packages via [`cargo new`] with the `edition` key set to the
latest edition. Setting the `edition` key in `[package]` will affect all
targets/crates in the package, including test suites, benchmarks, binaries,
examples, etc.
@@ -364,6 +364,17 @@ package-name = "my-awesome-android-app"
assets = "path/to/static"
```
+#### The `default-run` field
+
+The `default-run` field in the `[package]` section of the manifest can be used
+to specify a default binary picked by [`cargo run`]. For example, when there is
+both `src/bin/a.rs` and `src/bin/b.rs`:
+
+```toml
+[package]
+default-run = "a"
+```
+
### Dependency sections
See the [specifying dependencies page](reference/specifying-dependencies.html) for
@@ -629,8 +640,8 @@ A crate may either specify `package.workspace` or specify `[workspace]`. That
is, a crate cannot both be a root crate in a workspace (contain `[workspace]`)
and also be a member crate of another workspace (contain `package.workspace`).
-Most of the time workspaces will not need to be dealt with as `cargo new` and
-`cargo init` will handle workspace configuration automatically.
+Most of the time workspaces will not need to be dealt with as [`cargo new`] and
+[`cargo init`] will handle workspace configuration automatically.
[globs]: https://docs.rs/glob/0.2.11/glob/struct.Pattern.html
@@ -643,7 +654,7 @@ manifest*.
#### Package selection
-In a workspace, package-related cargo commands like `cargo build` apply to
+In a workspace, package-related cargo commands like [`cargo build`] apply to
packages selected by `-p` / `--package` or `--all` command-line parameters.
When neither is specified, the optional `default-members` configuration is used:
@@ -733,7 +744,7 @@ You can build individual library examples with the command `cargo build
### Tests
-When you run `cargo test`, Cargo will:
+When you run [`cargo test`], Cargo will:
* compile and run your library’s unit tests, which are in the files reachable
from `lib.rs` (naturally, any sections marked with `#[cfg(test)]` will be
@@ -745,7 +756,7 @@ When you run `cargo test`, Cargo will:
#### Integration tests
-Each file in `tests/*.rs` is an integration test. When you run `cargo test`,
+Each file in `tests/*.rs` is an integration test. When you run [`cargo test`],
Cargo will compile each of these files as a separate crate. The crate can link
to your library by using `extern crate `, like any other code that
depends on it.
@@ -966,6 +977,11 @@ source (e.g., git or a local path).
More information about overriding dependencies can be found in the [overriding
dependencies][replace] section of the documentation.
+[`cargo build`]: commands/cargo-build.html
+[`cargo init`]: commands/cargo-init.html
+[`cargo new`]: commands/cargo-new.html
+[`cargo run`]: commands/cargo-run.html
+[`cargo test`]: commands/cargo-test.html
[spdx-2.1-license-expressions]: https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60
-[spdx-license-list]: https://spdx.org/licenses/
[spdx-license-list-2.4]: https://github.com/spdx/license-list-data/tree/v2.4
+[spdx-license-list]: https://spdx.org/licenses/
diff --git a/src/doc/src/reference/unstable.md b/src/doc/src/reference/unstable.md
index 8f8d38b7a..d524e9433 100644
--- a/src/doc/src/reference/unstable.md
+++ b/src/doc/src/reference/unstable.md
@@ -155,18 +155,6 @@ Example:
cargo +nightly build --build-plan -Z unstable-options
```
-### default-run
-* Original issue: [#2200](https://github.com/rust-lang/cargo/issues/2200)
-
-The `default-run` option in the `[package]` section of the manifest can be used
-to specify a default binary picked by `cargo run`. For example, when there is
-both `src/bin/a.rs` and `src/bin/b.rs`:
-
-```toml
-[package]
-default-run = "a"
-```
-
### Metabuild
* Tracking Issue: [rust-lang/rust#49803](https://github.com/rust-lang/rust/issues/49803)
* RFC: [#2196](https://github.com/rust-lang/rfcs/blob/master/text/2196-metabuild.md)
diff --git a/src/etc/man/cargo-run.1 b/src/etc/man/cargo-run.1
index bd5f1bfe9..da42337d2 100644
--- a/src/etc/man/cargo-run.1
+++ b/src/etc/man/cargo-run.1
@@ -2,12 +2,12 @@
.\" Title: cargo-run
.\" Author: [see the "AUTHOR(S)" section]
.\" Generator: Asciidoctor 1.5.8
-.\" Date: 2019-05-08
+.\" Date: 2019-06-21
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
-.TH "CARGO\-RUN" "1" "2019-05-08" "\ \&" "\ \&"
+.TH "CARGO\-RUN" "1" "2019-06-21" "\ \&" "\ \&"
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.ss \n[.ss] 0
@@ -54,7 +54,8 @@ the SPEC format.
.sp
When no target selection options are given, \fBcargo run\fP will run the binary
target. If there are multiple binary targets, you must pass a target flag to
-choose one.
+choose one. Or, the \fBdefault\-run\fP field may be specified in the \fB[package]\fP
+section of \fBCargo.toml\fP to choose the name of the binary to run by default.
.sp
\fB\-\-bin\fP \fINAME\fP
.RS 4
diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs
index 0f8162f68..4ffcaf70b 100644
--- a/tests/testsuite/build.rs
+++ b/tests/testsuite/build.rs
@@ -936,7 +936,7 @@ fn cargo_compile_with_filename() {
"\
[ERROR] no bin target named `a.rs`
-Did you mean `a`?",
+Did you mean `a`?",
)
.run();
@@ -951,7 +951,7 @@ Did you mean `a`?",
"\
[ERROR] no example target named `a.rs`
-Did you mean `a`?",
+Did you mean `a`?",
)
.run();
}
@@ -4417,7 +4417,7 @@ fn target_filters_workspace() {
"\
[ERROR] no example target named `ex`
-Did you mean `ex1`?",
+Did you mean `ex1`?",
)
.run();
diff --git a/tests/testsuite/profile_overrides.rs b/tests/testsuite/profile_overrides.rs
index 1bb7e95d4..8445460b5 100644
--- a/tests/testsuite/profile_overrides.rs
+++ b/tests/testsuite/profile_overrides.rs
@@ -141,7 +141,7 @@ fn profile_override_warnings() {
[WARNING] version or URL in profile override spec `bar:1.2.3` does not match any of the packages: bar v0.5.0 ([..])
[WARNING] profile override spec `bart` did not match any packages
-Did you mean `bar`?
+Did you mean `bar`?
[WARNING] profile override spec `no-suggestion` did not match any packages
[COMPILING] [..]
",
diff --git a/tests/testsuite/required_features.rs b/tests/testsuite/required_features.rs
index 7ed557219..1e82b0fda 100644
--- a/tests/testsuite/required_features.rs
+++ b/tests/testsuite/required_features.rs
@@ -1154,8 +1154,8 @@ fn run_default_multiple_required_features() {
.with_status(101)
.with_stderr(
"\
- error: `cargo run` requires that a package only have one executable; \
- use the `--bin` option to specify which one to run\navailable binaries: foo1, foo2",
+error: `cargo run` could not determine which binary to run[..]
+available binaries: foo1, foo2",
)
.run();
}
diff --git a/tests/testsuite/run.rs b/tests/testsuite/run.rs
index 12f828043..97261c20b 100644
--- a/tests/testsuite/run.rs
+++ b/tests/testsuite/run.rs
@@ -168,22 +168,11 @@ fn too_many_bins() {
// Using [..] here because the order is not stable
p.cargo("run")
- .with_status(101)
- .with_stderr(
- "[ERROR] `cargo run` requires that a package only \
- have one executable; use the `--bin` option \
- to specify which one to run\navailable binaries: [..]\n",
- )
- .run();
-
- // Using [..] here because the order is not stable
- p.cargo("run")
- .masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr(
"[ERROR] `cargo run` could not determine which binary to run. \
- Use the `--bin` option to specify a binary, or (on \
- nightly) the `default-run` manifest key.\
+ Use the `--bin` option to specify a binary, or the \
+ `default-run` manifest key.\
\navailable binaries: [..]\n",
)
.run();
@@ -241,8 +230,6 @@ fn specify_default_run() {
.file(
"Cargo.toml",
r#"
- cargo-features = ["default-run"]
-
[project]
name = "foo"
version = "0.0.1"
@@ -255,18 +242,9 @@ fn specify_default_run() {
.file("src/bin/b.rs", r#"fn main() { println!("hello B"); }"#)
.build();
- p.cargo("run")
- .masquerade_as_nightly_cargo()
- .with_stdout("hello A")
- .run();
- p.cargo("run --bin a")
- .masquerade_as_nightly_cargo()
- .with_stdout("hello A")
- .run();
- p.cargo("run --bin b")
- .masquerade_as_nightly_cargo()
- .with_stdout("hello B")
- .run();
+ p.cargo("run").with_stdout("hello A").run();
+ p.cargo("run --bin a").with_stdout("hello A").run();
+ p.cargo("run --bin b").with_stdout("hello B").run();
}
#[cargo_test]
@@ -275,8 +253,6 @@ fn bogus_default_run() {
.file(
"Cargo.toml",
r#"
- cargo-features = ["default-run"]
-
[project]
name = "foo"
version = "0.0.1"
@@ -288,61 +264,17 @@ fn bogus_default_run() {
.file("src/bin/a.rs", r#"fn main() { println!("hello A"); }"#)
.build();
- p.cargo("run")
- .masquerade_as_nightly_cargo()
- .with_status(101)
- .with_stderr("error: no bin target named `b`\n\nDid you mean [..]?")
- .run();
-}
-
-#[cargo_test]
-fn default_run_unstable() {
- let p = project()
- .file(
- "Cargo.toml",
- r#"
- [project]
- name = "foo"
- version = "0.0.1"
- authors = []
- default-run = "a"
- "#,
- )
- .file("src/bin/a.rs", r#"fn main() { println!("hello A"); }"#)
- .build();
-
p.cargo("run")
.with_status(101)
.with_stderr(
- r#"error: failed to parse manifest at [..]
+ "\
+[ERROR] failed to parse manifest at `[..]/foo/Cargo.toml`
Caused by:
- the `default-run` manifest key is unstable
+ default-run target `b` not found
-Caused by:
- feature `default-run` is required
-
-this Cargo does not support nightly features, but if you
-switch to nightly channel you can add
-`cargo-features = ["default-run"]` to enable this feature
-"#,
- )
- .run();
-
- p.cargo("run")
- .masquerade_as_nightly_cargo()
- .with_status(101)
- .with_stderr(
- r#"error: failed to parse manifest at [..]
-
-Caused by:
- the `default-run` manifest key is unstable
-
-Caused by:
- feature `default-run` is required
-
-consider adding `cargo-features = ["default-run"]` to the manifest
-"#,
+Did you mean `a`?
+",
)
.run();
}
@@ -586,7 +518,7 @@ fn run_with_filename() {
"\
[ERROR] no bin target named `a.rs`
-Did you mean `a`?",
+Did you mean `a`?",
)
.run();
@@ -601,7 +533,7 @@ Did you mean `a`?",
"\
[ERROR] no example target named `a.rs`
-Did you mean `a`?",
+Did you mean `a`?",
)
.run();
}
@@ -1103,7 +1035,7 @@ fn run_workspace() {
.with_status(101)
.with_stderr(
"\
-[ERROR] `cargo run` requires that a package only have one executable[..]
+[ERROR] `cargo run` could not determine which binary to run[..]
available binaries: a, b",
)
.run();
@@ -1123,8 +1055,6 @@ fn default_run_workspace() {
.file(
"a/Cargo.toml",
r#"
- cargo-features = ["default-run"]
-
[project]
name = "a"
version = "0.0.1"
@@ -1136,10 +1066,7 @@ fn default_run_workspace() {
.file("b/src/main.rs", r#"fn main() {println!("run-b");}"#)
.build();
- p.cargo("run")
- .masquerade_as_nightly_cargo()
- .with_stdout("run-a")
- .run();
+ p.cargo("run").with_stdout("run-a").run();
}
#[cargo_test]