mirror of https://github.com/rust-lang/cargo
feat(lints): Error check the lints table
This commit is contained in:
parent
8de25292fd
commit
fad2ea5cfd
|
@ -2891,12 +2891,33 @@ impl TomlManifest {
|
|||
}
|
||||
|
||||
fn verify_lints(lints: Option<&TomlLints>, features: &Features) -> CargoResult<()> {
|
||||
if lints.is_none() {
|
||||
return Ok(());
|
||||
};
|
||||
let Some(lints) = lints else { return Ok(()); };
|
||||
|
||||
features.require(Feature::lints())?;
|
||||
|
||||
for (tool, lints) in lints {
|
||||
let supported = ["rust", "clippy", "rustdoc"];
|
||||
if !supported.contains(&tool.as_str()) {
|
||||
let supported = supported.join(", ");
|
||||
anyhow::bail!("unsupported `{tool}` in `[lints]`, must be one of {supported}")
|
||||
}
|
||||
for name in lints.keys() {
|
||||
if let Some((prefix, suffix)) = name.split_once("::") {
|
||||
if tool == prefix {
|
||||
anyhow::bail!(
|
||||
"`lints.{tool}.{name}` is not valid lint name; try `lints.{prefix}.{suffix}`"
|
||||
)
|
||||
} else if tool == "rust" && supported.contains(&prefix) {
|
||||
anyhow::bail!(
|
||||
"`lints.{tool}.{name}` is not valid lint name; try `lints.{prefix}.{suffix}`"
|
||||
)
|
||||
} else {
|
||||
anyhow::bail!("`lints.{tool}.{name}` is not a valid lint name")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
@ -67,3 +67,139 @@ Caused by:
|
|||
")
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn fail_on_invalid_tool() {
|
||||
let foo = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
cargo-features = ["lints"]
|
||||
|
||||
[package]
|
||||
name = "foo"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[workspace.lints.super-awesome-linter]
|
||||
unsafe_code = "forbid"
|
||||
"#,
|
||||
)
|
||||
.file("src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
foo.cargo("check")
|
||||
.masquerade_as_nightly_cargo(&["lints"])
|
||||
.with_status(101)
|
||||
.with_stderr(
|
||||
"\
|
||||
[..]
|
||||
|
||||
Caused by:
|
||||
unsupported `super-awesome-linter` in `[lints]`, must be one of rust, clippy, rustdoc
|
||||
",
|
||||
)
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn fail_on_tool_injection() {
|
||||
let foo = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
cargo-features = ["lints"]
|
||||
|
||||
[package]
|
||||
name = "foo"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[workspace.lints.rust]
|
||||
"clippy::cyclomatic_complexity" = "warn"
|
||||
"#,
|
||||
)
|
||||
.file("src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
foo.cargo("check")
|
||||
.masquerade_as_nightly_cargo(&["lints"])
|
||||
.with_status(101)
|
||||
.with_stderr(
|
||||
"\
|
||||
[..]
|
||||
|
||||
Caused by:
|
||||
`lints.rust.clippy::cyclomatic_complexity` is not valid lint name; try `lints.clippy.cyclomatic_complexity`
|
||||
",
|
||||
)
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn fail_on_redundant_tool() {
|
||||
let foo = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
cargo-features = ["lints"]
|
||||
|
||||
[package]
|
||||
name = "foo"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[workspace.lints.rust]
|
||||
"rust::unsafe_code" = "forbid"
|
||||
"#,
|
||||
)
|
||||
.file("src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
foo.cargo("check")
|
||||
.masquerade_as_nightly_cargo(&["lints"])
|
||||
.with_status(101)
|
||||
.with_stderr(
|
||||
"\
|
||||
[..]
|
||||
|
||||
Caused by:
|
||||
`lints.rust.rust::unsafe_code` is not valid lint name; try `lints.rust.unsafe_code`
|
||||
",
|
||||
)
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cargo_test]
|
||||
fn fail_on_conflicting_tool() {
|
||||
let foo = project()
|
||||
.file(
|
||||
"Cargo.toml",
|
||||
r#"
|
||||
cargo-features = ["lints"]
|
||||
|
||||
[package]
|
||||
name = "foo"
|
||||
version = "0.0.1"
|
||||
authors = []
|
||||
|
||||
[workspace.lints.rust]
|
||||
"super-awesome-tool::unsafe_code" = "forbid"
|
||||
"#,
|
||||
)
|
||||
.file("src/lib.rs", "")
|
||||
.build();
|
||||
|
||||
foo.cargo("check")
|
||||
.masquerade_as_nightly_cargo(&["lints"])
|
||||
.with_status(101)
|
||||
.with_stderr(
|
||||
"\
|
||||
[..]
|
||||
|
||||
Caused by:
|
||||
`lints.rust.super-awesome-tool::unsafe_code` is not a valid lint name
|
||||
",
|
||||
)
|
||||
.run();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue