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 22afaccf493b7..19f12d9a5a2df 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 f392d3b9d902b..2e357b09326a8 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 89ea225f2889d..afc75c336d604 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 fae6568eaf3b9..bc5a2343b51c7 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 d287e80cc89a0..b248ad836a8cb 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 28c6abf8bc489..6442e97879514 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 2a7b1e9c6cef1..3a7dce1b2b162 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 7c33a60a23b64..837991cf5d741 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 bf28ec878f4b3..01ab5138b7192 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 42e5a0e07b968..04db74a14af4b 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 b1acd89bf11b9..ad699c4bad4ec 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 4206fe85ade3f..299e72eec579c 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 139436d95b22d..2c7d8545fb7e1 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 255dc582532bd..b72bce9d03ca8 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 49a0dbc0a7fc1..8f5145ed42e81 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 af219d58e0592..7b6848898621b 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 018f7d1f08b78..ca4b63dc3284c 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 cd01707da8ba9..3e16927a754b1 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 555c57e47d9f7..6aed37292dff0 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 bfd2dcbc286b9..45d8fe3a97aa3 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 5e44966f8c75d..9234bee18cc46 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 94d749de2c82f..112b364a8bb28 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 1f58d53340b55..5d95c486d6a07 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 ead8ee80897ea..0a91d5fc1f14f 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 1ecbd5280a7b1..6766b8ac3c67f 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 be7a36b3c6e00..6de7fd0dc4d2a 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 21f2e0415126d..3cce028e35445 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 b8a4328da34d7..858ca72e707d1 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 fa6f818561919..58db142732b5b 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 a5b3e42d4ca32..038ca449328b7 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 1f91935e48e67..d34a649a95c4b 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