Skip to content

Commit 02f241c

Browse files
authored
Switch to workspace based lint configuration (#747)
As of the Cargo included in Rust 1.74, lints can now be configured in `Cargo.toml` across whole crates/workspaces: https://blog.rust-lang.org/2023/11/16/Rust-1.74.0.html https://doc.rust-lang.org/stable/cargo/reference/manifest.html#the-lints-section https://doc.rust-lang.org/stable/cargo/reference/workspaces.html#the-lints-table This reduces the boilerplate, and chance that we forget to enable lints in some targets. The only thing we need to remember is to add the `[lints] workspace = true` to any new crates in the future. Making this switch exposed a few places where lints weren't enabled and issues had been missed, eg: #746 Since this feature requires Rust 1.74, the MSRV has also been bumped. (Though we will have had to do so soon anyway to be able to start using `Result::inspect_err`, which is due in Rust 1.76, xref: #723 (comment)) GUS-W-14511805.
1 parent 335b351 commit 02f241c

File tree

47 files changed

+109
-121
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+109
-121
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
### Changed
1313

14+
- Raised Minimum Supported Rust Version (MSRV) to `1.74`. ([#747](https://github.com/heroku/libcnb.rs/pull/747))
1415
- Improved the consistency of all user-facing libcnb.rs error message wordings. ([#722](https://github.com/heroku/libcnb.rs/pull/722))
1516
- The assistance error message shown when the necessary cross-compilation tools are not found now also includes the `rustup target add` step. ([#729](https://github.com/heroku/libcnb.rs/pull/729))
1617
- Updated the documentation for `TestRunner::build` and `TestContext::start_container` to mention when Docker resource teardown occurs. ([#743](https://github.com/heroku/libcnb.rs/pull/743))

Cargo.toml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,22 @@ members = [
1919

2020
[workspace.package]
2121
version = "0.15.0"
22-
rust-version = "1.64"
22+
rust-version = "1.74"
2323
edition = "2021"
2424
license = "BSD-3-Clause"
2525

26+
[workspace.lints.rust]
27+
unused_crate_dependencies = "warn"
28+
29+
[workspace.lints.clippy]
30+
panic_in_result_fn = "warn"
31+
pedantic = "warn"
32+
unwrap_used = "warn"
33+
# In most cases adding error docs provides little value.
34+
missing_errors_doc = "allow"
35+
# This lint is too noisy and enforces a style that reduces readability in many cases.
36+
module_name_repetitions = "allow"
37+
2638
[workspace.dependencies]
2739
libcnb = { version = "=0.15.0", path = "libcnb" }
2840
libcnb-common = { version = "=0.15.0", path = "libcnb-common" }

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[docs.rs]: https://docs.rs/libcnb/latest/libcnb/
77
[Latest Version]: https://img.shields.io/crates/v/libcnb.svg
88
[crates.io]: https://crates.io/crates/libcnb
9-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
9+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
1010
[install-rust]: https://www.rust-lang.org/tools/install
1111

1212
`libcnb.rs` is a framework for writing [Cloud Native Buildpacks](https://buildpacks.io) in Rust.

examples/basics/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,8 @@ edition.workspace = true
55
rust-version.workspace = true
66
publish = false
77

8+
[lints]
9+
workspace = true
10+
811
[dependencies]
912
libcnb.workspace = true

examples/basics/src/main.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
// Enable Clippy lints that are disabled by default.
2-
// https://rust-lang.github.io/rust-clippy/stable/index.html
3-
#![warn(clippy::pedantic)]
4-
51
use libcnb::build::{BuildContext, BuildResult, BuildResultBuilder};
62
use libcnb::detect::{DetectContext, DetectResult, DetectResultBuilder};
73
use libcnb::generic::{GenericError, GenericMetadata, GenericPlatform};

examples/execd/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ edition.workspace = true
55
rust-version.workspace = true
66
publish = false
77

8+
[lints]
9+
workspace = true
10+
811
[dependencies]
912
libcnb.workspace = true
1013
fastrand = "2.0.0"

examples/execd/src/bin/dice_roller.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
// Enable Clippy lints that are disabled by default.
2-
// https://rust-lang.github.io/rust-clippy/stable/index.html
3-
#![warn(clippy::pedantic)]
4-
51
use libcnb::data::exec_d::ExecDProgramOutputKey;
62
use libcnb::data::exec_d_program_output_key;
73
use libcnb::exec_d::write_exec_d_program_output;
84
use std::collections::HashMap;
95
use std::iter;
106

7+
// Suppress warnings due to the `unused_crate_dependencies` lint not handling integration tests well.
8+
#[cfg(test)]
9+
use libcnb_test as _;
10+
1111
fn main() {
1212
write_exec_d_program_output(env_vars());
1313
}

examples/execd/src/main.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
// Enable Clippy lints that are disabled by default.
2-
// https://rust-lang.github.io/rust-clippy/stable/index.html
3-
#![warn(clippy::pedantic)]
4-
// This lint is too noisy and enforces a style that reduces readability in many cases.
5-
#![allow(clippy::module_name_repetitions)]
6-
71
mod layer;
82

93
use crate::layer::ExecDLayer;
@@ -13,6 +7,11 @@ use libcnb::detect::{DetectContext, DetectResult, DetectResultBuilder};
137
use libcnb::generic::{GenericError, GenericMetadata, GenericPlatform};
148
use libcnb::{buildpack_main, Buildpack};
159

10+
// Suppress warnings due to the `unused_crate_dependencies` lint not handling integration tests well.
11+
use fastrand as _;
12+
#[cfg(test)]
13+
use libcnb_test as _;
14+
1615
pub(crate) struct ExecDBuildpack;
1716

1817
impl Buildpack for ExecDBuildpack {

examples/execd/tests/integration_test.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! All integration tests are skipped by default (using the `ignore` attribute)
22
//! since performing builds is slow. To run them use: `cargo test -- --ignored`.
33
4-
// Enable Clippy lints that are disabled by default.
5-
// https://rust-lang.github.io/rust-clippy/stable/index.html
6-
#![warn(clippy::pedantic)]
4+
// Required due to: https://github.com/rust-lang/rust/issues/95513
5+
#![allow(unused_crate_dependencies)]
76

87
use libcnb_test::{assert_contains, assert_empty, BuildConfig, TestRunner};
98

examples/ruby-sample/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ edition.workspace = true
55
rust-version.workspace = true
66
publish = false
77

8+
[lints]
9+
workspace = true
10+
811
[dependencies]
912
flate2 = { version = "1.0.27", default-features = false, features = ["zlib"] }
1013
libcnb.workspace = true

examples/ruby-sample/src/layers/bundler.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ impl Layer for BundlerLayer {
3030
}
3131
}
3232

33+
// TODO: Remove use of unwrap(): https://github.com/heroku/libcnb.rs/issues/746
34+
#[allow(clippy::unwrap_used)]
3335
fn create(
3436
&self,
3537
context: &BuildContext<Self::Buildpack>,
@@ -84,6 +86,8 @@ impl Layer for BundlerLayer {
8486
})
8587
}
8688

89+
// TODO: Remove use of unwrap(): https://github.com/heroku/libcnb.rs/issues/746
90+
#[allow(clippy::unwrap_used)]
8791
fn update(
8892
&self,
8993
context: &BuildContext<Self::Buildpack>,

examples/ruby-sample/src/main.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
// Enable Clippy lints that are disabled by default.
2-
// https://rust-lang.github.io/rust-clippy/stable/index.html
3-
#![warn(clippy::pedantic)]
4-
// This lint is too noisy and enforces a style that reduces readability in many cases.
5-
#![allow(clippy::module_name_repetitions)]
6-
71
use crate::layers::{BundlerLayer, RubyLayer};
82
use crate::util::{DownloadError, UntarError};
93
use libcnb::build::{BuildContext, BuildResult, BuildResultBuilder};
@@ -16,6 +10,10 @@ use libcnb::{buildpack_main, Buildpack};
1610
use serde::Deserialize;
1711
use std::process::ExitStatus;
1812

13+
// Suppress warnings due to the `unused_crate_dependencies` lint not handling integration tests well.
14+
#[cfg(test)]
15+
use libcnb_test as _;
16+
1917
mod layers;
2018
mod util;
2119

examples/ruby-sample/tests/integration_test.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! All integration tests are skipped by default (using the `ignore` attribute)
22
//! since performing builds is slow. To run them use: `cargo test -- --ignored`.
33
4-
// Enable Clippy lints that are disabled by default.
5-
// https://rust-lang.github.io/rust-clippy/stable/index.html
6-
#![warn(clippy::pedantic)]
4+
// Required due to: https://github.com/rust-lang/rust/issues/95513
5+
#![allow(unused_crate_dependencies)]
76

87
use libcnb_test::{
98
assert_contains, assert_not_contains, BuildConfig, ContainerConfig, PackResult, TestRunner,

libcnb-cargo/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ include = ["src/**/*", "LICENSE", "README.md"]
1515
name = "cargo-libcnb"
1616
path = "src/main.rs"
1717

18+
[lints]
19+
workspace = true
20+
1821
[dependencies]
1922
clap = { version = "4.3.24", default-features = false, features = [
2023
"derive",

libcnb-cargo/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,5 @@ pack build my-image-name \
5353

5454
[Latest Version]: https://img.shields.io/crates/v/libcnb-cargo.svg
5555
[crates.io]: https://crates.io/crates/libcnb-cargo
56-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
56+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
5757
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-cargo/src/main.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
#![doc = include_str!("../README.md")]
2-
#![warn(unused_crate_dependencies)]
3-
#![warn(clippy::pedantic)]
4-
#![warn(clippy::panic_in_result_fn)]
5-
#![warn(clippy::unwrap_used)]
6-
// This lint is too noisy and enforces a style that reduces readability in many cases.
7-
#![allow(clippy::module_name_repetitions)]
82

93
// Suppress warnings due to the `unused_crate_dependencies` lint not handling integration tests well.
104
#[cfg(test)]

libcnb-cargo/tests/integration_test.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! All integration tests are skipped by default (using the `ignore` attribute)
22
//! since performing builds is slow. To run them use: `cargo test -- --ignored`.
33
4-
// Enable Clippy lints that are disabled by default.
5-
// https://rust-lang.github.io/rust-clippy/stable/index.html
6-
#![warn(clippy::pedantic)]
4+
// Required due to: https://github.com/rust-lang/rust/issues/95513
5+
#![allow(unused_crate_dependencies)]
76

87
use libcnb_common::toml_file::read_toml_file;
98
use libcnb_data::buildpack::{BuildpackDescriptor, BuildpackId};
@@ -276,6 +275,8 @@ fn package_command_respects_ignore_files() {
276275
);
277276
}
278277

278+
// Allow required due to: https://github.com/rust-lang/rust-clippy/issues/11119
279+
#[allow(clippy::unwrap_used)]
279280
fn validate_packaged_buildpack(packaged_buildpack_dir: &Path, buildpack_id: &BuildpackId) {
280281
assert!(packaged_buildpack_dir.join("buildpack.toml").exists());
281282
assert!(packaged_buildpack_dir.join("package.toml").exists());
@@ -291,6 +292,8 @@ fn validate_packaged_buildpack(packaged_buildpack_dir: &Path, buildpack_id: &Bui
291292
);
292293
}
293294

295+
// Allow required due to: https://github.com/rust-lang/rust-clippy/issues/11119
296+
#[allow(clippy::unwrap_used)]
294297
fn validate_packaged_composite_buildpack(
295298
packaged_buildpack_dir: &Path,
296299
buildpack_id: &BuildpackId,

libcnb-common/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ documentation = "https://docs.rs/libcnb-common"
1010
readme = "README.md"
1111
include = ["src/**/*", "LICENSE", "README.md"]
1212

13+
[lints]
14+
workspace = true
15+
1316
[dependencies]
1417
serde = { version = "1.0.188", features = ["derive"] }
1518
thiserror = "1.0.48"

libcnb-common/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ This is an internal crate and should not be used by users directly. There are no
88
[docs.rs]: https://docs.rs/libcnb-proc-macros/latest/libcnb_common/
99
[Latest Version]: https://img.shields.io/crates/v/libcnb-common.svg
1010
[crates.io]: https://crates.io/crates/libcnb-common
11-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
11+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
1212
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-common/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
11
#![doc = include_str!("../README.md")]
2-
#![warn(unused_crate_dependencies)]
3-
#![warn(clippy::pedantic)]
4-
#![warn(clippy::panic_in_result_fn)]
5-
#![warn(clippy::unwrap_used)]
6-
// This lint is too noisy and enforces a style that reduces readability in many cases.
7-
#![allow(clippy::module_name_repetitions)]
82

93
pub mod toml_file;

libcnb-data/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ documentation = "https://docs.rs/libcnb-data"
1111
readme = "README.md"
1212
include = ["src/**/*", "LICENSE", "README.md"]
1313

14+
[lints]
15+
workspace = true
16+
1417
[dependencies]
1518
fancy-regex = { version = "0.12.0", default-features = false, features = ["std"] }
1619
libcnb-proc-macros.workspace = true

libcnb-data/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ on this crate directly.
1010
[docs.rs]: https://docs.rs/libcnb-data/latest/libcnb_data/
1111
[Latest Version]: https://img.shields.io/crates/v/libcnb-data.svg
1212
[crates.io]: https://crates.io/crates/libcnb-data
13-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
13+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
1414
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-data/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
#![doc = include_str!("../README.md")]
2-
#![warn(unused_crate_dependencies)]
3-
#![warn(clippy::pedantic)]
4-
#![warn(clippy::panic_in_result_fn)]
5-
#![warn(clippy::unwrap_used)]
6-
// This lint is too noisy and enforces a style that reduces readability in many cases.
7-
#![allow(clippy::module_name_repetitions)]
82

93
pub mod build;
104
pub mod build_plan;

libcnb-package/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ documentation = "https://docs.rs/libcnb-package"
1111
readme = "README.md"
1212
include = ["src/**/*", "LICENSE", "README.md"]
1313

14+
[lints]
15+
workspace = true
16+
1417
[dependencies]
1518
cargo_metadata = "0.18.0"
1619
ignore = "0.4"

libcnb-package/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ directly.
1212
[docs.rs]: https://docs.rs/libcnb-package/latest/libcnb_package/
1313
[Latest Version]: https://img.shields.io/crates/v/libcnb-package.svg
1414
[crates.io]: https://crates.io/crates/libcnb-package
15-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
15+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
1616
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-package/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
#![doc = include_str!("../README.md")]
2-
#![warn(unused_crate_dependencies)]
3-
#![warn(clippy::pedantic)]
4-
#![warn(clippy::panic_in_result_fn)]
5-
#![warn(clippy::unwrap_used)]
6-
// This lint is too noisy and enforces a style that reduces readability in many cases.
7-
#![allow(clippy::module_name_repetitions)]
82

93
pub mod build;
104
pub mod buildpack_dependency_graph;

libcnb-proc-macros/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ include = ["src/**/*", "LICENSE", "README.md"]
1313
[lib]
1414
proc-macro = true
1515

16+
[lints]
17+
workspace = true
18+
1619
[dependencies]
1720
cargo_metadata = "0.18.0"
1821
fancy-regex = { version = "0.12.0", default-features = false, features = ["std"] }

libcnb-proc-macros/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ depending on this crate directly.
99
[docs.rs]: https://docs.rs/libcnb-proc-macros/latest/libcnb_proc_macros/
1010
[Latest Version]: https://img.shields.io/crates/v/libcnb-proc-macros.svg
1111
[crates.io]: https://crates.io/crates/libcnb-proc-macros
12-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
12+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
1313
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-proc-macros/src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
#![doc = include_str!("../README.md")]
2-
#![warn(unused_crate_dependencies)]
3-
#![warn(clippy::pedantic)]
4-
#![warn(clippy::panic_in_result_fn)]
5-
#![warn(clippy::unwrap_used)]
62

73
use proc_macro::TokenStream;
84
use quote::quote;

libcnb-test/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ documentation = "https://docs.rs/libcnb-test"
1111
readme = "README.md"
1212
include = ["src/**/*", "LICENSE", "README.md"]
1313

14+
[lints]
15+
workspace = true
16+
1417
[dependencies]
1518
fastrand = "2.0.0"
1619
fs_extra = "1.3.0"

libcnb-test/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,5 +226,5 @@ fn additional_buildpacks() {
226226
[docs.rs]: https://docs.rs/libcnb-test/latest/libcnb_test/
227227
[Latest Version]: https://img.shields.io/crates/v/libcnb-test.svg
228228
[crates.io]: https://crates.io/crates/libcnb-test
229-
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.64+-lightgray.svg
229+
[MSRV]: https://img.shields.io/badge/MSRV-rustc_1.74+-lightgray.svg
230230
[install-rust]: https://www.rust-lang.org/tools/install

libcnb-test/src/lib.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
11
#![doc = include_str!("../README.md")]
2-
// Enable lints that are disabled by default.
3-
#![warn(unused_crate_dependencies)]
4-
#![warn(clippy::pedantic)]
5-
#![warn(clippy::panic_in_result_fn)]
6-
#![warn(clippy::unwrap_used)]
7-
// This lint is too noisy and enforces a style that reduces readability in many cases.
8-
#![allow(clippy::module_name_repetitions)]
92

103
mod app;
114
mod build;

libcnb-test/tests/integration_test.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
//! to test dynamic values, in which case the only option is to use `panic::catch_unwind`
66
//! since `should_panic` doesn't support globs/regular expressions/compile time macros.
77
8-
// Enable Clippy lints that are disabled by default.
9-
// https://rust-lang.github.io/rust-clippy/stable/index.html
10-
#![warn(clippy::pedantic)]
8+
// Required due to: https://github.com/rust-lang/rust/issues/95513
9+
#![allow(unused_crate_dependencies)]
1110

1211
use indoc::{formatdoc, indoc};
1312
use libcnb_data::buildpack_id;

libcnb/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ documentation = "https://docs.rs/libcnb"
1111
readme = "README.md"
1212
include = ["src/**/*", "LICENSE", "README.md"]
1313

14+
[lints]
15+
workspace = true
16+
1417
[dependencies]
1518
anyhow = { version = "1.0.75", optional = true }
1619
cyclonedx-bom = { version = "0.4.0", optional = true }

0 commit comments

Comments
 (0)