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.
This commit is contained in:
Stefan Holderbach 2024-08-28 23:37:17 +02:00 committed by GitHub
parent 644bebf4c6
commit 84e1ac27e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
31 changed files with 126 additions and 30 deletions

View File

@ -180,6 +180,14 @@ windows = "0.54"
windows-sys = "0.48" windows-sys = "0.48"
winreg = "0.52" 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] [dependencies]
nu-cli = { path = "./crates/nu-cli", version = "0.97.2" } nu-cli = { path = "./crates/nu-cli", version = "0.97.2" }
nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.97.2" } nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.97.2" }

View File

@ -46,4 +46,7 @@ which = { workspace = true }
[features] [features]
plugin = ["nu-plugin-engine"] plugin = ["nu-plugin-engine"]
system-clipboard = ["reedline/system_clipboard"] system-clipboard = ["reedline/system_clipboard"]
[lints]
workspace = true

View File

@ -9,6 +9,9 @@ version = "0.97.2"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-parser = { path = "../nu-parser", 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 } indexmap = { workspace = true }
miette = { workspace = true } miette = { workspace = true }
[dev-dependencies] [dev-dependencies]

View File

@ -12,6 +12,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" } nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" }
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
@ -35,4 +38,4 @@ itertools = { workspace = true }
[dev-dependencies] [dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.97.2" } nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.97.2" }
nu-command = { path = "../nu-command", version = "0.97.2" } nu-command = { path = "../nu-command", version = "0.97.2" }
nu-test-support = { path = "../nu-test-support", version = "0.97.2" } nu-test-support = { path = "../nu-test-support", version = "0.97.2" }

View File

@ -11,6 +11,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-parser = { path = "../nu-parser", version = "0.97.2" } nu-parser = { path = "../nu-parser", version = "0.97.2" }
@ -28,4 +31,4 @@ mimalloc = []
trash-support = [] trash-support = []
sqlite = [] sqlite = []
static-link-openssl = [] static-link-openssl = []
system-clipboard = [] system-clipboard = []

View File

@ -9,6 +9,9 @@ version = "0.97.2"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-path = { path = "../nu-path", 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 } itertools = { workspace = true }
[dev-dependencies] [dev-dependencies]

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" }
nu-engine = { path = "../nu-engine", 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"] } serde = { workspace = true, features = ["derive"] }
[dev-dependencies] [dev-dependencies]
nu-test-support = { path = "../nu-test-support", version = "0.97.2" } nu-test-support = { path = "../nu-test-support", version = "0.97.2" }

View File

@ -12,6 +12,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" } nu-cmd-base = { path = "../nu-cmd-base", version = "0.97.2" }
nu-color-config = { path = "../nu-color-config", version = "0.97.2" } nu-color-config = { path = "../nu-color-config", version = "0.97.2" }

View File

@ -13,9 +13,12 @@ proc-macro = true
# so we cannot test anything useful in a doctest # so we cannot test anything useful in a doctest
doctest = false doctest = false
[lints]
workspace = true
[dependencies] [dependencies]
proc-macro2 = { workspace = true } proc-macro2 = { workspace = true }
syn = { workspace = true } syn = { workspace = true }
quote = { workspace = true } quote = { workspace = true }
proc-macro-error = { workspace = true } proc-macro-error = { workspace = true }
heck = { workspace = true } heck = { workspace = true }

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", features = ["plugin"], version = "0.97.2" } nu-protocol = { path = "../nu-protocol", features = ["plugin"], version = "0.97.2" }
nu-path = { path = "../nu-path", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" }
@ -19,4 +22,4 @@ log = { workspace = true }
terminal_size = { workspace = true } terminal_size = { workspace = true }
[features] [features]
plugin = [] plugin = []

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" }
nu-parser = { path = "../nu-parser", 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 } unicode-width = { workspace = true }
lscolors = { workspace = true, default-features = false, features = [ lscolors = { workspace = true, default-features = false, features = [
"nu-ansi-term", "nu-ansi-term",
] } ] }

View File

@ -14,4 +14,7 @@ categories = ["filesystem"]
bench = false bench = false
[dev-dependencies] [dev-dependencies]
doc-comment = "0.3" doc-comment = "0.3"
[lints]
workspace = true

View File

@ -29,4 +29,7 @@ serde_json = { workspace = true }
nu-test-support = { path = "../nu-test-support", version = "0.97.2" } nu-test-support = { path = "../nu-test-support", version = "0.97.2" }
nu-path = { path = "../nu-path", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" }
serde_json = "1.0" serde_json = "1.0"
fancy-regex = "0.13.0" fancy-regex = "0.13.0"
[lints]
workspace = true

View File

@ -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-command = { path = "../nu-command", version = "0.97.2" }
nu-test-support = { path = "../nu-test-support", version = "0.97.2" } nu-test-support = { path = "../nu-test-support", version = "0.97.2" }
assert-json-diff = "2.0" assert-json-diff = "2.0"
[lints]
workspace = true

View File

@ -11,6 +11,9 @@ exclude = ["/fuzz"]
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-path = { path = "../nu-path", 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 } rstest = { workspace = true, default-features = false }
[features] [features]
plugin = ["nu-plugin-engine"] plugin = ["nu-plugin-engine"]

View File

@ -18,4 +18,7 @@ dirs = { workspace = true }
omnipath = { workspace = true } omnipath = { workspace = true }
[target.'cfg(all(unix, not(target_os = "macos"), not(target_os = "android")))'.dependencies] [target.'cfg(all(unix, not(target_os = "macos"), not(target_os = "android")))'.dependencies]
pwd = { workspace = true } pwd = { workspace = true }
[lints]
workspace = true

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.97.2", default-features = false } 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"] local-socket = ["interprocess", "nu-plugin-protocol/local-socket"]
[target.'cfg(target_os = "windows")'.dependencies] [target.'cfg(target_os = "windows")'.dependencies]
windows = { workspace = true } windows = { workspace = true }

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-protocol = { path = "../nu-protocol", 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 = [ windows = { workspace = true, features = [
# For setting process creation flags # For setting process creation flags
"Win32_System_Threading", "Win32_System_Threading",
] } ] }

View File

@ -244,7 +244,7 @@ mod tests {
let mut state = test_state(); let mut state = test_state();
state.config.enabled = true; state.config.enabled = true;
state.config.stop_after = Duration::from_secs(1).as_nanos() as i64; 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)); assert_eq!(Some(Duration::ZERO), state.next_timeout(now));
} }
@ -295,7 +295,8 @@ mod tests {
#[test] #[test]
fn adding_locks_changes_last_update() { fn adding_locks_changes_last_update() {
let mut state = test_state(); 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.last_update = original_last_update;
state.handle_message(PluginGcMsg::AddLocks(1)); state.handle_message(PluginGcMsg::AddLocks(1));
assert_ne!(original_last_update, state.last_update, "not updated"); assert_ne!(original_last_update, state.last_update, "not updated");

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.97.2", features = ["plugin"] } nu-protocol = { path = "../nu-protocol", version = "0.97.2", features = ["plugin"] }
nu-utils = { path = "../nu-utils", version = "0.97.2" } nu-utils = { path = "../nu-utils", version = "0.97.2" }
@ -21,4 +24,4 @@ typetag = "0.2"
[features] [features]
default = ["local-socket"] default = ["local-socket"]
local-socket = [] local-socket = []

View File

@ -9,6 +9,9 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin-test
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
@ -25,4 +28,4 @@ similar = "2.6"
[dev-dependencies] [dev-dependencies]
typetag = "0.2" typetag = "0.2"
serde = "1.0" serde = "1.0"

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-engine = { path = "../nu-engine", version = "0.97.2" } nu-engine = { path = "../nu-engine", version = "0.97.2" }
nu-protocol = { path = "../nu-protocol", 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] [target.'cfg(target_family = "unix")'.dependencies]
# For setting the process group ID (EnterForeground / LeaveForeground) # For setting the process group ID (EnterForeground / LeaveForeground)
nix = { workspace = true, default-features = false, features = ["process"] } nix = { workspace = true, default-features = false, features = ["process"] }

View File

@ -13,9 +13,12 @@ name = "nu_pretty_hex"
path = "src/lib.rs" path = "src/lib.rs"
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-ansi-term = { workspace = true } nu-ansi-term = { workspace = true }
[dev-dependencies] [dev-dependencies]
heapless = { version = "0.8", default-features = false } heapless = { version = "0.8", default-features = false }
rand = "0.8" rand = "0.8"

View File

@ -12,6 +12,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-utils = { path = "../nu-utils", version = "0.97.2" } nu-utils = { path = "../nu-utils", version = "0.97.2" }
nu-path = { path = "../nu-path", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" }
@ -61,4 +64,4 @@ tempfile = { workspace = true }
os_pipe = { workspace = true } os_pipe = { workspace = true }
[package.metadata.docs.rs] [package.metadata.docs.rs]
all-features = true all-features = true

View File

@ -13,4 +13,7 @@ nu-protocol = { version = "0.97.2", path = "../nu-protocol" }
nu-engine = { version = "0.97.2", path = "../nu-engine" } nu-engine = { version = "0.97.2", path = "../nu-engine" }
miette = { workspace = true, features = ["fancy-no-backtrace"] } miette = { workspace = true, features = ["fancy-no-backtrace"] }
log = "0.4" log = "0.4"
[lints]
workspace = true

View File

@ -12,6 +12,9 @@ license = "MIT"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
libc = { workspace = true } libc = { workspace = true }
log = { workspace = true } log = { workspace = true }
@ -45,4 +48,4 @@ windows = { workspace = true, features = [
"Win32_System_SystemInformation", "Win32_System_SystemInformation",
"Win32_System_Threading", "Win32_System_Threading",
"Win32_UI_Shell", "Win32_UI_Shell",
]} ]}

View File

@ -10,6 +10,9 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.97.2" } nu-protocol = { path = "../nu-protocol", version = "0.97.2" }
nu-utils = { path = "../nu-utils", 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 } tabled = { workspace = true, features = ["ansi"], default-features = false }
[dev-dependencies] [dev-dependencies]
# nu-test-support = { path="../nu-test-support", version = "0.97.2" } # nu-test-support = { path="../nu-test-support", version = "0.97.2" }

View File

@ -10,7 +10,10 @@ version = "0.97.2"
[lib] [lib]
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-utils = { path = "../nu-utils", version = "0.97.2" } nu-utils = { path = "../nu-utils", version = "0.97.2" }
unicode-width = { workspace = true } unicode-width = { workspace = true }

View File

@ -11,6 +11,9 @@ version = "0.97.2"
doctest = false doctest = false
bench = false bench = false
[lints]
workspace = true
[dependencies] [dependencies]
nu-path = { path = "../nu-path", version = "0.97.2" } nu-path = { path = "../nu-path", version = "0.97.2" }
nu-glob = { path = "../nu-glob", 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 } num-format = { workspace = true }
which = { workspace = true } which = { workspace = true }
tempfile = { workspace = true } tempfile = { workspace = true }

View File

@ -29,4 +29,7 @@ unicase = "2.7.0"
crossterm_winapi = "0.9" crossterm_winapi = "0.9"
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
nix = { workspace = true, default-features = false, features = ["user", "fs"] } nix = { workspace = true, default-features = false, features = ["user", "fs"] }
[lints]
workspace = true

View File

@ -17,4 +17,7 @@ once_cell = { workspace = true }
fancy-regex = { workspace = true } fancy-regex = { workspace = true }
[dev-dependencies] [dev-dependencies]
chrono = { workspace = true } chrono = { workspace = true }
[lints]
workspace = true