From 84e1ac27e5ac80398ff428e1476968e1c42f7c2f Mon Sep 17 00:00:00 2001 From: Stefan Holderbach Date: Wed, 28 Aug 2024 23:37:17 +0200 Subject: [PATCH] Setup global `cargo` lint configuration (#13691) # Description `cargo` somewhat recently gained the capability to store `lints` settings for the crate and workspace, that can override the defaults from `rustc` and `clippy` lints. This means we can enforce some lints without having to actively pass them to clippy via `cargo clippy -- -W ...`. So users just forking the repo have an easier time to follow similar requirements like our CI. ## Limitation An exception that remains is that those lints apply to both the primary code base and the tests. Thus we can't include e.g. `unwrap_used` without generating noise in the tests. Here the setup in the CI remains the most helpful. ## Included lints - Add `clippy::unchecked_duration_subtraction` (added by #12549) # User-Facing Changes Running `cargo clippy --workspace` should be closer to the CI. This has benefits for editor configured runs of clippy and saves you from having to use `toolkit` to be close to CI in more cases. --- Cargo.toml | 8 ++++++++ crates/nu-cli/Cargo.toml | 5 ++++- crates/nu-cmd-base/Cargo.toml | 5 ++++- crates/nu-cmd-extra/Cargo.toml | 5 ++++- crates/nu-cmd-lang/Cargo.toml | 5 ++++- crates/nu-cmd-plugin/Cargo.toml | 5 ++++- crates/nu-color-config/Cargo.toml | 5 ++++- crates/nu-command/Cargo.toml | 3 +++ crates/nu-derive-value/Cargo.toml | 5 ++++- crates/nu-engine/Cargo.toml | 5 ++++- crates/nu-explore/Cargo.toml | 5 ++++- crates/nu-glob/Cargo.toml | 5 ++++- crates/nu-json/Cargo.toml | 5 ++++- crates/nu-lsp/Cargo.toml | 5 ++++- crates/nu-parser/Cargo.toml | 5 ++++- crates/nu-path/Cargo.toml | 5 ++++- crates/nu-plugin-core/Cargo.toml | 5 ++++- crates/nu-plugin-engine/Cargo.toml | 5 ++++- crates/nu-plugin-engine/src/gc.rs | 5 +++-- crates/nu-plugin-protocol/Cargo.toml | 5 ++++- crates/nu-plugin-test-support/Cargo.toml | 5 ++++- crates/nu-plugin/Cargo.toml | 5 ++++- crates/nu-pretty-hex/Cargo.toml | 5 ++++- crates/nu-protocol/Cargo.toml | 5 ++++- crates/nu-std/Cargo.toml | 5 ++++- crates/nu-system/Cargo.toml | 5 ++++- crates/nu-table/Cargo.toml | 5 ++++- crates/nu-term-grid/Cargo.toml | 5 ++++- crates/nu-test-support/Cargo.toml | 5 ++++- crates/nu-utils/Cargo.toml | 5 ++++- crates/nuon/Cargo.toml | 5 ++++- 31 files changed, 126 insertions(+), 30 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 22afaccf49..19f12d9a5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -180,6 +180,14 @@ windows = "0.54" windows-sys = "0.48" winreg = "0.52" +[workspace.lints.clippy] +# Warning: workspace lints affect library code as well as tests, so don't enable lints that would be too noisy in tests like that. +# todo = "warn" +unchecked_duration_subtraction = "warn" + +[lints] +workspace = true + [dependencies] nu-cli = { path = "./crates/nu-cli", version = "0.97.2" } nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.97.2" } diff --git a/crates/nu-cli/Cargo.toml b/crates/nu-cli/Cargo.toml index f392d3b9d9..2e357b0932 100644 --- a/crates/nu-cli/Cargo.toml +++ b/crates/nu-cli/Cargo.toml @@ -46,4 +46,7 @@ which = { workspace = true } [features] plugin = ["nu-plugin-engine"] -system-clipboard = ["reedline/system_clipboard"] \ No newline at end of file +system-clipboard = ["reedline/system_clipboard"] + +[lints] +workspace = true diff --git a/crates/nu-cmd-base/Cargo.toml b/crates/nu-cmd-base/Cargo.toml index 89ea225f28..afc75c336d 100644 --- a/crates/nu-cmd-base/Cargo.toml +++ b/crates/nu-cmd-base/Cargo.toml @@ -9,6 +9,9 @@ version = "0.97.2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-parser = { path = "../nu-parser", version = "0.97.2" } @@ -18,4 +21,4 @@ nu-protocol = { path = "../nu-protocol", version = "0.97.2" } indexmap = { workspace = true } miette = { workspace = true } -[dev-dependencies] \ No newline at end of file +[dev-dependencies] diff --git a/crates/nu-cmd-extra/Cargo.toml b/crates/nu-cmd-extra/Cargo.toml index fae6568eaf..bc5a2343b5 100644 --- a/crates/nu-cmd-extra/Cargo.toml +++ b/crates/nu-cmd-extra/Cargo.toml @@ -12,6 +12,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" } @@ -35,4 +38,4 @@ itertools = { workspace = true } [dev-dependencies] nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.97.2" } nu-command = { path = "../nu-command", version = "0.97.2" } -nu-test-support = { path = "../nu-test-support", version = "0.97.2" } \ No newline at end of file +nu-test-support = { path = "../nu-test-support", version = "0.97.2" } diff --git a/crates/nu-cmd-lang/Cargo.toml b/crates/nu-cmd-lang/Cargo.toml index d287e80cc8..b248ad836a 100644 --- a/crates/nu-cmd-lang/Cargo.toml +++ b/crates/nu-cmd-lang/Cargo.toml @@ -11,6 +11,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-parser = { path = "../nu-parser", version = "0.97.2" } @@ -28,4 +31,4 @@ mimalloc = [] trash-support = [] sqlite = [] static-link-openssl = [] -system-clipboard = [] \ No newline at end of file +system-clipboard = [] diff --git a/crates/nu-cmd-plugin/Cargo.toml b/crates/nu-cmd-plugin/Cargo.toml index 28c6abf8bc..6442e97879 100644 --- a/crates/nu-cmd-plugin/Cargo.toml +++ b/crates/nu-cmd-plugin/Cargo.toml @@ -9,6 +9,9 @@ version = "0.97.2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" } @@ -17,4 +20,4 @@ nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.97.2" } itertools = { workspace = true } -[dev-dependencies] \ No newline at end of file +[dev-dependencies] diff --git a/crates/nu-color-config/Cargo.toml b/crates/nu-color-config/Cargo.toml index 2a7b1e9c6c..3a7dce1b2b 100644 --- a/crates/nu-color-config/Cargo.toml +++ b/crates/nu-color-config/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" } @@ -19,4 +22,4 @@ nu-ansi-term = { workspace = true } serde = { workspace = true, features = ["derive"] } [dev-dependencies] -nu-test-support = { path = "../nu-test-support", version = "0.97.2" } \ No newline at end of file +nu-test-support = { path = "../nu-test-support", version = "0.97.2" } diff --git a/crates/nu-command/Cargo.toml b/crates/nu-command/Cargo.toml index 7c33a60a23..837991cf5d 100644 --- a/crates/nu-command/Cargo.toml +++ b/crates/nu-command/Cargo.toml @@ -12,6 +12,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" } nu-color-config = { path = "../nu-color-config", version = "0.97.2" } diff --git a/crates/nu-derive-value/Cargo.toml b/crates/nu-derive-value/Cargo.toml index bf28ec878f..01ab5138b7 100644 --- a/crates/nu-derive-value/Cargo.toml +++ b/crates/nu-derive-value/Cargo.toml @@ -13,9 +13,12 @@ proc-macro = true # so we cannot test anything useful in a doctest doctest = false +[lints] +workspace = true + [dependencies] proc-macro2 = { workspace = true } syn = { workspace = true } quote = { workspace = true } proc-macro-error = { workspace = true } -heck = { workspace = true } \ No newline at end of file +heck = { workspace = true } diff --git a/crates/nu-engine/Cargo.toml b/crates/nu-engine/Cargo.toml index 42e5a0e07b..04db74a14a 100644 --- a/crates/nu-engine/Cargo.toml +++ b/crates/nu-engine/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", features = ["plugin"], version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" } @@ -19,4 +22,4 @@ log = { workspace = true } terminal_size = { workspace = true } [features] -plugin = [] \ No newline at end of file +plugin = [] diff --git a/crates/nu-explore/Cargo.toml b/crates/nu-explore/Cargo.toml index b1acd89bf1..ad699c4bad 100644 --- a/crates/nu-explore/Cargo.toml +++ b/crates/nu-explore/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-parser = { path = "../nu-parser", version = "0.97.2" } @@ -32,4 +35,4 @@ ansi-str = { workspace = true } unicode-width = { workspace = true } lscolors = { workspace = true, default-features = false, features = [ "nu-ansi-term", -] } \ No newline at end of file +] } diff --git a/crates/nu-glob/Cargo.toml b/crates/nu-glob/Cargo.toml index 4206fe85ad..299e72eec5 100644 --- a/crates/nu-glob/Cargo.toml +++ b/crates/nu-glob/Cargo.toml @@ -14,4 +14,7 @@ categories = ["filesystem"] bench = false [dev-dependencies] -doc-comment = "0.3" \ No newline at end of file +doc-comment = "0.3" + +[lints] +workspace = true diff --git a/crates/nu-json/Cargo.toml b/crates/nu-json/Cargo.toml index 139436d95b..2c7d8545fb 100644 --- a/crates/nu-json/Cargo.toml +++ b/crates/nu-json/Cargo.toml @@ -29,4 +29,7 @@ serde_json = { workspace = true } nu-test-support = { path = "../nu-test-support", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" } serde_json = "1.0" -fancy-regex = "0.13.0" \ No newline at end of file +fancy-regex = "0.13.0" + +[lints] +workspace = true diff --git a/crates/nu-lsp/Cargo.toml b/crates/nu-lsp/Cargo.toml index 255dc58253..b72bce9d03 100644 --- a/crates/nu-lsp/Cargo.toml +++ b/crates/nu-lsp/Cargo.toml @@ -27,4 +27,7 @@ nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.97.2" } nu-command = { path = "../nu-command", version = "0.97.2" } nu-test-support = { path = "../nu-test-support", version = "0.97.2" } -assert-json-diff = "2.0" \ No newline at end of file +assert-json-diff = "2.0" + +[lints] +workspace = true diff --git a/crates/nu-parser/Cargo.toml b/crates/nu-parser/Cargo.toml index 49a0dbc0a7..8f5145ed42 100644 --- a/crates/nu-parser/Cargo.toml +++ b/crates/nu-parser/Cargo.toml @@ -11,6 +11,9 @@ exclude = ["/fuzz"] [lib] bench = false +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" } @@ -27,4 +30,4 @@ serde_json = { workspace = true } rstest = { workspace = true, default-features = false } [features] -plugin = ["nu-plugin-engine"] \ No newline at end of file +plugin = ["nu-plugin-engine"] diff --git a/crates/nu-path/Cargo.toml b/crates/nu-path/Cargo.toml index af219d58e0..7b68488986 100644 --- a/crates/nu-path/Cargo.toml +++ b/crates/nu-path/Cargo.toml @@ -18,4 +18,7 @@ dirs = { workspace = true } omnipath = { workspace = true } [target.'cfg(all(unix, not(target_os = "macos"), not(target_os = "android")))'.dependencies] -pwd = { workspace = true } \ No newline at end of file +pwd = { workspace = true } + +[lints] +workspace = true diff --git a/crates/nu-plugin-core/Cargo.toml b/crates/nu-plugin-core/Cargo.toml index 018f7d1f08..ca4b63dc32 100644 --- a/crates/nu-plugin-core/Cargo.toml +++ b/crates/nu-plugin-core/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.97.2", default-features = false } @@ -25,4 +28,4 @@ default = ["local-socket"] local-socket = ["interprocess", "nu-plugin-protocol/local-socket"] [target.'cfg(target_os = "windows")'.dependencies] -windows = { workspace = true } \ No newline at end of file +windows = { workspace = true } diff --git a/crates/nu-plugin-engine/Cargo.toml b/crates/nu-plugin-engine/Cargo.toml index cd01707da8..3e16927a75 100644 --- a/crates/nu-plugin-engine/Cargo.toml +++ b/crates/nu-plugin-engine/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" } @@ -32,4 +35,4 @@ local-socket = ["nu-plugin-core/local-socket"] windows = { workspace = true, features = [ # For setting process creation flags "Win32_System_Threading", -] } \ No newline at end of file +] } diff --git a/crates/nu-plugin-engine/src/gc.rs b/crates/nu-plugin-engine/src/gc.rs index 555c57e47d..6aed37292d 100644 --- a/crates/nu-plugin-engine/src/gc.rs +++ b/crates/nu-plugin-engine/src/gc.rs @@ -244,7 +244,7 @@ mod tests { let mut state = test_state(); state.config.enabled = true; state.config.stop_after = Duration::from_secs(1).as_nanos() as i64; - state.last_update = Some(now - Duration::from_secs(2)); + state.last_update = Some(now.checked_sub(Duration::from_secs(2)).unwrap()); assert_eq!(Some(Duration::ZERO), state.next_timeout(now)); } @@ -295,7 +295,8 @@ mod tests { #[test] fn adding_locks_changes_last_update() { let mut state = test_state(); - let original_last_update = Some(Instant::now() - Duration::from_secs(1)); + let original_last_update = + Some(Instant::now().checked_sub(Duration::from_secs(1)).unwrap()); state.last_update = original_last_update; state.handle_message(PluginGcMsg::AddLocks(1)); assert_ne!(original_last_update, state.last_update, "not updated"); diff --git a/crates/nu-plugin-protocol/Cargo.toml b/crates/nu-plugin-protocol/Cargo.toml index bfd2dcbc28..45d8fe3a97 100644 --- a/crates/nu-plugin-protocol/Cargo.toml +++ b/crates/nu-plugin-protocol/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", version = "0.97.2", features = ["plugin"] } nu-utils = { path = "../nu-utils", version = "0.97.2" } @@ -21,4 +24,4 @@ typetag = "0.2" [features] default = ["local-socket"] -local-socket = [] \ No newline at end of file +local-socket = [] diff --git a/crates/nu-plugin-test-support/Cargo.toml b/crates/nu-plugin-test-support/Cargo.toml index 5e44966f8c..9234bee18c 100644 --- a/crates/nu-plugin-test-support/Cargo.toml +++ b/crates/nu-plugin-test-support/Cargo.toml @@ -9,6 +9,9 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin-test [lib] bench = false +[lints] +workspace = true + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] @@ -25,4 +28,4 @@ similar = "2.6" [dev-dependencies] typetag = "0.2" -serde = "1.0" \ No newline at end of file +serde = "1.0" diff --git a/crates/nu-plugin/Cargo.toml b/crates/nu-plugin/Cargo.toml index 94d749de2c..112b364a8b 100644 --- a/crates/nu-plugin/Cargo.toml +++ b/crates/nu-plugin/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" } @@ -30,4 +33,4 @@ local-socket = ["nu-plugin-core/local-socket"] [target.'cfg(target_family = "unix")'.dependencies] # For setting the process group ID (EnterForeground / LeaveForeground) -nix = { workspace = true, default-features = false, features = ["process"] } \ No newline at end of file +nix = { workspace = true, default-features = false, features = ["process"] } diff --git a/crates/nu-pretty-hex/Cargo.toml b/crates/nu-pretty-hex/Cargo.toml index 1f58d53340..5d95c486d6 100644 --- a/crates/nu-pretty-hex/Cargo.toml +++ b/crates/nu-pretty-hex/Cargo.toml @@ -13,9 +13,12 @@ name = "nu_pretty_hex" path = "src/lib.rs" bench = false +[lints] +workspace = true + [dependencies] nu-ansi-term = { workspace = true } [dev-dependencies] heapless = { version = "0.8", default-features = false } -rand = "0.8" \ No newline at end of file +rand = "0.8" diff --git a/crates/nu-protocol/Cargo.toml b/crates/nu-protocol/Cargo.toml index ead8ee8089..0a91d5fc1f 100644 --- a/crates/nu-protocol/Cargo.toml +++ b/crates/nu-protocol/Cargo.toml @@ -12,6 +12,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-utils = { path = "../nu-utils", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" } @@ -61,4 +64,4 @@ tempfile = { workspace = true } os_pipe = { workspace = true } [package.metadata.docs.rs] -all-features = true \ No newline at end of file +all-features = true diff --git a/crates/nu-std/Cargo.toml b/crates/nu-std/Cargo.toml index 1ecbd5280a..6766b8ac3c 100644 --- a/crates/nu-std/Cargo.toml +++ b/crates/nu-std/Cargo.toml @@ -13,4 +13,7 @@ nu-protocol = { version = "0.97.2", path = "../nu-protocol" } nu-engine = { version = "0.97.2", path = "../nu-engine" } miette = { workspace = true, features = ["fancy-no-backtrace"] } -log = "0.4" \ No newline at end of file +log = "0.4" + +[lints] +workspace = true diff --git a/crates/nu-system/Cargo.toml b/crates/nu-system/Cargo.toml index be7a36b3c6..6de7fd0dc4 100644 --- a/crates/nu-system/Cargo.toml +++ b/crates/nu-system/Cargo.toml @@ -12,6 +12,9 @@ license = "MIT" [lib] bench = false +[lints] +workspace = true + [dependencies] libc = { workspace = true } log = { workspace = true } @@ -45,4 +48,4 @@ windows = { workspace = true, features = [ "Win32_System_SystemInformation", "Win32_System_Threading", "Win32_UI_Shell", -]} \ No newline at end of file +]} diff --git a/crates/nu-table/Cargo.toml b/crates/nu-table/Cargo.toml index 21f2e04151..3cce028e35 100644 --- a/crates/nu-table/Cargo.toml +++ b/crates/nu-table/Cargo.toml @@ -10,6 +10,9 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-utils = { path = "../nu-utils", version = "0.97.2" } @@ -21,4 +24,4 @@ fancy-regex = { workspace = true } tabled = { workspace = true, features = ["ansi"], default-features = false } [dev-dependencies] -# nu-test-support = { path="../nu-test-support", version = "0.97.2" } \ No newline at end of file +# nu-test-support = { path="../nu-test-support", version = "0.97.2" } diff --git a/crates/nu-term-grid/Cargo.toml b/crates/nu-term-grid/Cargo.toml index b8a4328da3..858ca72e70 100644 --- a/crates/nu-term-grid/Cargo.toml +++ b/crates/nu-term-grid/Cargo.toml @@ -10,7 +10,10 @@ version = "0.97.2" [lib] bench = false +[lints] +workspace = true + [dependencies] nu-utils = { path = "../nu-utils", version = "0.97.2" } -unicode-width = { workspace = true } \ No newline at end of file +unicode-width = { workspace = true } diff --git a/crates/nu-test-support/Cargo.toml b/crates/nu-test-support/Cargo.toml index fa6f818561..58db142732 100644 --- a/crates/nu-test-support/Cargo.toml +++ b/crates/nu-test-support/Cargo.toml @@ -11,6 +11,9 @@ version = "0.97.2" doctest = false bench = false +[lints] +workspace = true + [dependencies] nu-path = { path = "../nu-path", version = "0.97.2" } nu-glob = { path = "../nu-glob", version = "0.97.2" } @@ -18,4 +21,4 @@ nu-utils = { path = "../nu-utils", version = "0.97.2" } num-format = { workspace = true } which = { workspace = true } -tempfile = { workspace = true } \ No newline at end of file +tempfile = { workspace = true } diff --git a/crates/nu-utils/Cargo.toml b/crates/nu-utils/Cargo.toml index a5b3e42d4c..038ca44932 100644 --- a/crates/nu-utils/Cargo.toml +++ b/crates/nu-utils/Cargo.toml @@ -29,4 +29,7 @@ unicase = "2.7.0" crossterm_winapi = "0.9" [target.'cfg(unix)'.dependencies] -nix = { workspace = true, default-features = false, features = ["user", "fs"] } \ No newline at end of file +nix = { workspace = true, default-features = false, features = ["user", "fs"] } + +[lints] +workspace = true diff --git a/crates/nuon/Cargo.toml b/crates/nuon/Cargo.toml index 1f91935e48..d34a649a95 100644 --- a/crates/nuon/Cargo.toml +++ b/crates/nuon/Cargo.toml @@ -17,4 +17,7 @@ once_cell = { workspace = true } fancy-regex = { workspace = true } [dev-dependencies] -chrono = { workspace = true } \ No newline at end of file +chrono = { workspace = true } + +[lints] +workspace = true