diff --git a/src/diagnostics/rules/redundant_readme.rs b/src/diagnostics/rules/redundant_readme.rs index 9df1ae1134c..c7897286d5c 100644 --- a/src/diagnostics/rules/redundant_readme.rs +++ b/src/diagnostics/rules/redundant_readme.rs @@ -22,6 +22,7 @@ use crate::diagnostics::workspace_rel_path; use crate::workspace::Package; use crate::workspace::Workspace; use crate::workspace::parser::DEFAULT_README_FILES; +use crate::workspace::parser::default_readme_from_package_root; pub static LINT: &Lint = &Lint { name: "redundant_readme", @@ -109,7 +110,9 @@ fn lint_package_inner( return Ok(()); }; - if !DEFAULT_README_FILES.contains(&readme.as_str()) { + if !DEFAULT_README_FILES.contains(&readme.as_str()) + || default_readme_from_package_root(pkg.root()).as_deref() != Some(readme) + { return Ok(()); } diff --git a/src/workspace/parser/mod.rs b/src/workspace/parser/mod.rs index 4098ef06dd0..e86bd4e95c6 100644 --- a/src/workspace/parser/mod.rs +++ b/src/workspace/parser/mod.rs @@ -859,7 +859,7 @@ pub const DEFAULT_README_FILES: [&str; 3] = ["README.md", "README.txt", "README" /// Checks if a file with any of the default README file names exists in the package root. /// If so, returns a `String` representing that name. -fn default_readme_from_package_root(package_root: &Path) -> Option { +pub(crate) fn default_readme_from_package_root(package_root: &Path) -> Option { for &readme_filename in DEFAULT_README_FILES.iter() { if package_root.join(readme_filename).is_file() { return Some(readme_filename.to_string()); diff --git a/tests/testsuite/lints/redundant_readme.rs b/tests/testsuite/lints/redundant_readme.rs index 5a0865caaa5..c820a9a91bc 100644 --- a/tests/testsuite/lints/redundant_readme.rs +++ b/tests/testsuite/lints/redundant_readme.rs @@ -41,6 +41,74 @@ redundant_readme = "warn" .run(); } +#[cargo_test] +fn lower_priority_readme() { + let p = project() + .file( + "Cargo.toml", + r#" +[package] +name = "foo" +version = "0.0.1" +edition = "2015" +authors = [] +readme = "README.txt" + +[lints.cargo] +default = { level = "allow", priority = -1 } +redundant_readme = "warn" +"#, + ) + .file("src/main.rs", "fn main() {}") + .file("README.md", "") + .file("README.txt", "") + .build(); + + p.cargo("fetch -Zcargo-lints") + .masquerade_as_nightly_cargo(&["cargo-lints"]) + .with_stderr_data(str![""]) + .run(); +} + +#[cargo_test] +fn explicit_readme_txt() { + let p = project() + .file( + "Cargo.toml", + r#" +[package] +name = "foo" +version = "0.0.1" +edition = "2015" +authors = [] +readme = "README.txt" + +[lints.cargo] +default = { level = "allow", priority = -1 } +redundant_readme = "warn" +"#, + ) + .file("src/main.rs", "fn main() {}") + .file("README.txt", "") + .build(); + + p.cargo("fetch -Zcargo-lints") + .masquerade_as_nightly_cargo(&["cargo-lints"]) + .with_stderr_data(str![[r#" +[WARNING] explicit `package.readme` can be inferred + --> Cargo.toml:7:1 + | +7 | readme = "README.txt" + | ^^^^^^^^^^^^^^^^^^^^^ + | + = [NOTE] `cargo::redundant_readme` is set to `warn` in `[lints]` +[HELP] consider removing `package.readme` +[WARNING] `foo` (manifest) generated 1 warning + +"#]]) + .run(); +} + #[cargo_test] fn implicit_readme() { let p = project()