rust/lintcheck
Philipp Krones 2ed97eb466
Create summary comment for lintcheck runs (#14816)
Previously https://github.com/rust-lang/triagebot/pull/1985

After a lintcheck run a comment will be created in the PR thread with an
overview of the changes, example here
https://github.com/Alexendoo/rust-clippy/pull/18#issuecomment-2880441316
(plus the normal GHA debugging experience)

It will only comment if there are some changes, if there's already an
existing comment it will be updated for each run

Similar to
https://github.com/rust-lang/team/blob/master/.github/workflows/dry-run.yml

The PR number is supplied by the lintcheck run, so technically someone
could forge it to be annoying and edit the summaries in other threads,
but that is pretty low impact and easy to deal with. There is a
`pull_requests` field on the event but as @Kobzol [pointed out to
me](https://github.com/rust-lang/triagebot/pull/1985#issuecomment-2869157116)
it's not populated for PRs from forks

r? @flip1995

changelog: none
2025-07-09 08:29:50 +00:00
..
ci-config Fix situations identified by collapsible_if new hits 2025-03-25 19:50:24 +01:00
src Create summary comment for lintcheck runs (#14816) 2025-07-09 08:29:50 +00:00
Cargo.toml Select edition 2024 2025-01-13 16:55:42 +01:00
ci_crates.toml Reinstate checking of tokio-rustls in lintcheck 2025-04-11 10:41:36 +02:00
lintcheck_crates.toml Merge commit '37f4fbb929' into clippy-subtree-update 2024-07-25 18:29:17 +02:00
README.md Merge commit 'b794b8e08c' into clippy-subtree-update 2024-07-11 15:44:03 +02:00
test_sources.toml Merge commit '6ed6f1e6a1' into clippyup 2021-03-12 15:30:50 +01:00

cargo lintcheck

Runs Clippy on a fixed set of crates read from lintcheck/lintcheck_crates.toml and saves logs of the lint warnings into the repo. We can then check the diff and spot new or disappearing warnings.

From the repo root, run:

cargo lintcheck

or

cargo run --target-dir lintcheck/target --manifest-path lintcheck/Cargo.toml

By default, the logs will be saved into lintcheck-logs/lintcheck_crates_logs.txt.

You can set a custom sources.toml by adding --crates-toml custom.toml or using LINTCHECK_TOML="custom.toml" where custom.toml must be a relative path from the repo root.

The results will then be saved to lintcheck-logs/custom_logs.toml.

The custom.toml file may be built using https://crates.io recently most downloaded crates by using cargo lintcheck popular. For example, to retrieve the 200 recently most downloaded crates:

cargo lintcheck popular -n 200 custom.toml

Note: Lintcheck isn't sandboxed. Only use it to check crates that you trust or sandbox it manually.

Configuring the Crate Sources

The sources to check are saved in a toml file. There are three types of sources.

  1. Crates-io Source

    bitflags = {name = "bitflags", versions = ['1.2.1']}
    

    Requires a "name" and one or multiple "versions" to be checked.

  2. git Source

    puffin = {name = "puffin", git_url = "https://github.com/EmbarkStudios/puffin", git_hash = "02dd4a3"}
    

    Requires a name, the url to the repo and unique identifier of a commit, branch or tag which is checked out before linting. There is no way to always check HEAD because that would lead to changing lint-results as the repo would get updated. If git_url or git_hash is missing, an error will be thrown.

  3. Local Dependency

    clippy = {name = "clippy", path = "/home/user/clippy"}
    

    For when you want to add a repository that is not published yet.

Command Line Options (optional)

clap = {name = "clap", versions = ['4.5.8'], options = ['-Fderive']}

It is possible to specify command line options for each crate. This makes it possible to enable or disable features.

Fix mode

You can run cargo lintcheck --fix which will run Clippy with --fix and print a warning if Clippy's suggestions fail to apply (if the resulting code does not build). This lets us spot bad suggestions or false positives automatically in some cases.

Note: Fix mode implies --all-targets, so it can fix as much code as it can.

Please note that the target dir should be cleaned afterwards since Clippy will modify the downloaded sources which can lead to unexpected results when running lintcheck again afterwards.

Recursive mode

You can run cargo lintcheck --recursive to also run Clippy on the dependencies of the crates listed in the crates source .toml. e.g. adding rand 0.8.5 would also lint rand_core, rand_chacha, etc.

Particularly slow crates in the dependency graph can be ignored using recursive.ignore:

[crates]
cargo = {name = "cargo", versions = ['0.64.0']}

[recursive]
ignore = [
    "unicode-normalization",
]