Moved checks into compile_options(), changed tests

This commit is contained in:
Damian 2019-01-03 23:00:45 +01:00
parent f1d6a94994
commit a51759c5e8
12 changed files with 119 additions and 190 deletions

View File

@ -72,9 +72,7 @@ Compilation can be customized with the `bench` profile in the manifest.
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let ws = args.workspace(config)?; let ws = args.workspace(config)?;
let mut compile_opts = args.compile_options(config, CompileMode::Bench)?; let mut compile_opts = args.compile_options(config, CompileMode::Bench, Some(&ws))?;
args.check_optional_opts_all(&ws, &compile_opts)?;
compile_opts.build_config.release = true; compile_opts.build_config.release = true;

View File

@ -48,9 +48,7 @@ the --release flag will use the `release` profile instead.
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let ws = args.workspace(config)?; let ws = args.workspace(config)?;
let mut compile_opts = args.compile_options(config, CompileMode::Build)?; let mut compile_opts = args.compile_options(config, CompileMode::Build, Some(&ws))?;
args.check_optional_opts_all(&ws, &compile_opts)?;
compile_opts.export_dir = args.value_of_path("out-dir", config); compile_opts.export_dir = args.value_of_path("out-dir", config);
if compile_opts.export_dir.is_some() && !config.cli_unstable().unstable_options { if compile_opts.export_dir.is_some() && !config.cli_unstable().unstable_options {

View File

@ -68,9 +68,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
} }
}; };
let mode = CompileMode::Check { test }; let mode = CompileMode::Check { test };
let compile_opts = args.compile_options(config, mode)?; let compile_opts = args.compile_options(config, mode, Some(&ws))?;
args.check_optional_opts_all(&ws, &compile_opts)?;
ops::compile(&ws, &compile_opts)?; ops::compile(&ws, &compile_opts)?;
Ok(()) Ok(())

View File

@ -50,7 +50,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let mode = CompileMode::Doc { let mode = CompileMode::Doc {
deps: !args.is_present("no-deps"), deps: !args.is_present("no-deps"),
}; };
let mut compile_opts = args.compile_options(config, mode)?; let mut compile_opts = args.compile_options(config, mode, Some(&ws))?;
compile_opts.local_rustdoc_args = if args.is_present("document-private-items") { compile_opts.local_rustdoc_args = if args.is_present("document-private-items") {
Some(vec!["--document-private-items".to_string()]) Some(vec!["--document-private-items".to_string()])
} else { } else {

View File

@ -122,9 +122,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
// Unlike other commands default `cargo fix` to all targets to fix as much // Unlike other commands default `cargo fix` to all targets to fix as much
// code as we can. // code as we can.
let mut opts = args.compile_options(config, mode)?; let mut opts = args.compile_options(config, mode, Some(&ws))?;
args.check_optional_opts_all(&ws, &opts)?;
if let CompileFilter::Default { .. } = opts.filter { if let CompileFilter::Default { .. } = opts.filter {
opts.filter = CompileFilter::Only { opts.filter = CompileFilter::Only {

View File

@ -78,11 +78,9 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let registry = args.registry(config)?; let registry = args.registry(config)?;
config.reload_rooted_at_cargo_home()?; config.reload_rooted_at_cargo_home()?;
let mut compile_opts = args.compile_options(config, CompileMode::Build)?;
let workspace = args.workspace(config).ok();
if let Ok(ws) = args.workspace(config) { let mut compile_opts = args.compile_options(config, CompileMode::Build, workspace.as_ref())?;
args.check_optional_opts_example_and_bin(&ws, &compile_opts)?;
}
compile_opts.build_config.release = !args.is_present("debug"); compile_opts.build_config.release = !args.is_present("debug");

View File

@ -39,9 +39,7 @@ run. If you're passing arguments to both Cargo and the binary, the ones after
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let ws = args.workspace(config)?; let ws = args.workspace(config)?;
let mut compile_opts = args.compile_options(config, CompileMode::Build)?; let mut compile_opts = args.compile_options(config, CompileMode::Build, Some(&ws))?;
args.check_optional_opts_example_and_bin(&ws, &compile_opts)?;
if !args.is_present("example") && !args.is_present("bin") { if !args.is_present("example") && !args.is_present("bin") {
let default_runs: Vec<_> = compile_opts let default_runs: Vec<_> = compile_opts

View File

@ -62,7 +62,7 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
return Err(CliError::new(err, 101)); return Err(CliError::new(err, 101));
} }
}; };
let mut compile_opts = args.compile_options_for_single_package(config, mode)?; let mut compile_opts = args.compile_options_for_single_package(config, mode, Some(&ws))?;
let target_args = values(args, "args"); let target_args = values(args, "args");
compile_opts.target_rustc_args = if target_args.is_empty() { compile_opts.target_rustc_args = if target_args.is_empty() {
None None

View File

@ -51,7 +51,7 @@ the `cargo help pkgid` command.
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let ws = args.workspace(config)?; let ws = args.workspace(config)?;
let mut compile_opts = let mut compile_opts =
args.compile_options_for_single_package(config, CompileMode::Doc { deps: false })?; args.compile_options_for_single_package(config, CompileMode::Doc { deps: false }, Some(&ws))?;
let target_args = values(args, "args"); let target_args = values(args, "args");
compile_opts.target_rustdoc_args = if target_args.is_empty() { compile_opts.target_rustdoc_args = if target_args.is_empty() {
None None

View File

@ -92,9 +92,7 @@ To get the list of all options available for the test binaries use this:
pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult {
let ws = args.workspace(config)?; let ws = args.workspace(config)?;
let mut compile_opts = args.compile_options(config, CompileMode::Test)?; let mut compile_opts = args.compile_options(config, CompileMode::Test, Some(&ws))?;
args.check_optional_opts_all(&ws, &compile_opts)?;
let doc = args.is_present("doc"); let doc = args.is_present("doc");
if doc { if doc {

View File

@ -288,6 +288,7 @@ pub trait ArgMatchesExt {
&self, &self,
config: &'a Config, config: &'a Config,
mode: CompileMode, mode: CompileMode,
workspace: Option<&Workspace<'a>>,
) -> CargoResult<CompileOptions<'a>> { ) -> CargoResult<CompileOptions<'a>> {
let spec = Packages::from_flags( let spec = Packages::from_flags(
self._is_present("all"), self._is_present("all"),
@ -344,6 +345,11 @@ pub trait ArgMatchesExt {
local_rustdoc_args: None, local_rustdoc_args: None,
export_dir: None, export_dir: None,
}; };
if let Some(ws) = workspace {
self.check_optional_opts(ws, &opts)?;
}
Ok(opts) Ok(opts)
} }
@ -351,8 +357,9 @@ pub trait ArgMatchesExt {
&self, &self,
config: &'a Config, config: &'a Config,
mode: CompileMode, mode: CompileMode,
workspace: Option<&Workspace<'a>>,
) -> CargoResult<CompileOptions<'a>> { ) -> CargoResult<CompileOptions<'a>> {
let mut compile_opts = self.compile_options(config, mode)?; let mut compile_opts = self.compile_options(config, mode, workspace)?;
compile_opts.spec = Packages::Packages(self._values_of("package")); compile_opts.spec = Packages::Packages(self._values_of("package"));
Ok(compile_opts) Ok(compile_opts)
} }
@ -429,27 +436,11 @@ about this warning.";
Ok(index) Ok(index)
} }
fn check_optional_opts_example_and_bin( fn check_optional_opts(
&self, &self,
workspace: &Workspace<'_>, workspace: &Workspace<'_>,
compile_opts: &CompileOptions<'_>, compile_opts: &CompileOptions<'_>,
) -> CliResult { ) -> CargoResult<()> {
if self.is_present_with_zero_values("example") {
print_available_examples(&workspace, &compile_opts)?;
}
if self.is_present_with_zero_values("bin") {
print_available_binaries(&workspace, &compile_opts)?;
}
Ok(())
}
fn check_optional_opts_all(
&self,
workspace: &Workspace<'_>,
compile_opts: &CompileOptions<'_>,
) -> CliResult {
if self.is_present_with_zero_values("example") { if self.is_present_with_zero_values("example") {
print_available_examples(&workspace, &compile_opts)?; print_available_examples(&workspace, &compile_opts)?;
} }

View File

@ -1,69 +1,12 @@
use crate::support::project; use crate::support::project;
// cargo {run,install} only support --example and --bin const EXAMPLE: u8 = 0x1;
// cargo {build,check,fix,test} support --example, --bin, --bench and --test const BIN: u8 = 0x2;
const TEST: u8 = 0x4;
const BENCH: u8 = 0x8;
fn test_list_targets_example_and_bin_only(command: &str) { fn list_targets_test(command: &str, targets: u8) {
let p = project() let full_project = project()
.file("examples/a.rs", "fn main() { }")
.file("examples/b.rs", "fn main() { }")
.file("src/main.rs", "fn main() { }")
.build();
p.cargo(&format!("{} --example", command))
.with_stderr(
"\
error: \"--example\" takes one argument.
Available examples:
a
b
",
)
.with_status(101)
.run();
p.cargo(&format!("{} --bin", command))
.with_stderr(
"\
error: \"--bin\" takes one argument.
Available binaries:
foo
",
)
.with_status(101)
.run();
}
fn test_empty_list_targets_example_and_bin_only(command: &str) {
let p = project().file("src/lib.rs", "").build();
p.cargo(&format!("{} --example", command))
.with_stderr(
"\
error: \"--example\" takes one argument.
No examples available.
",
)
.with_status(101)
.run();
p.cargo(&format!("{} --bin", command))
.with_stderr(
"\
error: \"--bin\" takes one argument.
No binaries available.
",
)
.with_status(101)
.run();
}
fn test_list_targets_full(command: &str) {
let p = project()
.file("examples/a.rs", "fn main() { }") .file("examples/a.rs", "fn main() { }")
.file("examples/b.rs", "fn main() { }") .file("examples/b.rs", "fn main() { }")
.file("benches/bench1.rs", "") .file("benches/bench1.rs", "")
@ -73,165 +16,174 @@ fn test_list_targets_full(command: &str) {
.file("src/main.rs", "fn main() { }") .file("src/main.rs", "fn main() { }")
.build(); .build();
p.cargo(&format!("{} --example", command)) if targets & EXAMPLE != 0 {
.with_stderr( full_project
"\ .cargo(&format!("{} --example", command))
.with_stderr(
"\
error: \"--example\" takes one argument. error: \"--example\" takes one argument.
Available examples: Available examples:
a a
b b
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --bin", command)) if targets & BIN != 0 {
.with_stderr( full_project
"\ .cargo(&format!("{} --bin", command))
.with_stderr(
"\
error: \"--bin\" takes one argument. error: \"--bin\" takes one argument.
Available binaries: Available binaries:
foo foo
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --bench", command)) if targets & BENCH != 0 {
.with_stderr( full_project
"\ .cargo(&format!("{} --bench", command))
.with_stderr(
"\
error: \"--bench\" takes one argument. error: \"--bench\" takes one argument.
Available benches: Available benches:
bench1 bench1
bench2 bench2
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --test", command)) if targets & TEST != 0 {
.with_stderr( full_project
"\ .cargo(&format!("{} --test", command))
.with_stderr(
"\
error: \"--test\" takes one argument. error: \"--test\" takes one argument.
Available tests: Available tests:
test1 test1
test2 test2
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
} }
fn test_empty_list_targets_full(command: &str) { let empty_project = project().file("src/lib.rs", "").build();
let p = project().file("src/lib.rs", "").build();
p.cargo(&format!("{} --example", command)) if targets & EXAMPLE != 0 {
.with_stderr( empty_project
"\ .cargo(&format!("{} --example", command))
.with_stderr(
"\
error: \"--example\" takes one argument. error: \"--example\" takes one argument.
No examples available. No examples available.
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --bin", command)) if targets & BIN != 0 {
.with_stderr( empty_project
"\ .cargo(&format!("{} --bin", command))
.with_stderr(
"\
error: \"--bin\" takes one argument. error: \"--bin\" takes one argument.
No binaries available. No binaries available.
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --bench", command)) if targets & BENCH != 0 {
.with_stderr( empty_project
"\ .cargo(&format!("{} --bench", command))
.with_stderr(
"\
error: \"--bench\" takes one argument. error: \"--bench\" takes one argument.
No benches available. No benches available.
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
p.cargo(&format!("{} --test", command)) if targets & TEST != 0 {
.with_stderr( empty_project
"\ .cargo(&format!("{} --test", command))
.with_stderr(
"\
error: \"--test\" takes one argument. error: \"--test\" takes one argument.
No tests available. No tests available.
", ",
) )
.with_status(101) .with_status(101)
.run(); .run();
}
} }
#[test] #[test]
fn build_list_targets() { fn build_list_targets() {
test_list_targets_full("build"); list_targets_test("build", EXAMPLE | BIN | TEST | BENCH);
}
#[test]
fn build_list_targets_empty() {
test_empty_list_targets_full("build");
} }
#[test] #[test]
fn check_list_targets() { fn check_list_targets() {
test_list_targets_full("check"); list_targets_test("check", EXAMPLE | BIN | TEST | BENCH);
} }
#[test] #[test]
fn check_list_targets_empty() { fn doc_list_targets() {
test_empty_list_targets_full("check"); list_targets_test("doc", BIN);
} }
#[test] #[test]
fn fix_list_targets() { fn fix_list_targets() {
test_list_targets_full("fix"); list_targets_test("fix", EXAMPLE | BIN | TEST | BENCH);
}
#[test]
fn fix_list_targets_empty() {
test_empty_list_targets_full("fix");
} }
#[test] #[test]
fn run_list_targets() { fn run_list_targets() {
test_list_targets_example_and_bin_only("run"); list_targets_test("run", EXAMPLE | BIN);
}
#[test]
fn run_list_targets_empty() {
test_empty_list_targets_example_and_bin_only("run");
} }
#[test] #[test]
fn test_list_targets() { fn test_list_targets() {
test_list_targets_full("test"); list_targets_test("test", EXAMPLE | BIN | TEST | BENCH);
}
#[test]
fn test_list_targets_empty() {
test_empty_list_targets_full("test");
} }
#[test] #[test]
fn bench_list_targets() { fn bench_list_targets() {
test_list_targets_full("bench"); list_targets_test("bench", EXAMPLE | BIN | TEST | BENCH);
}
#[test]
fn bench_list_targets_empty() {
test_empty_list_targets_full("bench");
} }
#[test] #[test]
fn install_list_targets() { fn install_list_targets() {
test_list_targets_example_and_bin_only("install"); list_targets_test("install", EXAMPLE | BIN);
} }
#[test] #[test]
fn install_list_targets_empty() { fn rustdoc_list_targets() {
test_empty_list_targets_example_and_bin_only("install"); list_targets_test("rustdoc", EXAMPLE | BIN | TEST | BENCH);
}
#[test]
fn rustc_list_targets() {
list_targets_test("rustc", EXAMPLE | BIN | TEST | BENCH);
} }