rust/lintcheck
bors eecff6d07b Auto merge of #12439 - Jacherr:issue-12185, r=blyxyas
fix ice reporting in lintcheck

Fixes https://github.com/rust-lang/rust-clippy/issues/12185

This PR fixes the lack of reported ICEs within lintcheck by modifying the way in which data is collected from each crate being linted.

Instead of lintcheck only reading `stdout` for warnings, it now also reads `stderr` for any potential ICE (although admittedly, it is not the cleanest method of doing so). If it is detected, it parses the ICE into its message and backtrace separately, and then adds them to the list of outputs via clippy.

Once all outputs are collected, the formatter then proceeds to generate the file as normal.

Note that this PR also has a couple of side effects:
- When clippy fails to process a package, but said failure is not an ICE, the `stderr` will be sent to the console;
- Instead of `ClippyWarning` being the primary struct for everything reported, there is now `ClippyCheckOutput`, an enum which splits the outputs into warnings and ICEs.

changelog: none
2024-04-05 18:16:07 +00:00
..
src Auto merge of #12439 - Jacherr:issue-12185, r=blyxyas 2024-04-05 18:16:07 +00:00
Cargo.toml Add spans to clippy.toml error messages 2023-06-02 00:56:27 +01:00
lintcheck_crates.toml
README.md Add the warning to all documentation. 2023-04-25 02:05:32 +02:00
test_sources.toml

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 run --target-dir lintcheck/target --manifest-path lintcheck/Cargo.toml

or

cargo lintcheck

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 the popular-crates binary from the lintcheck directory. For example, to retrieve the 100 recently most downloaded crates:

cargo run --release --bin popular-crates -- -n 100 custom.toml

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)

bitflags = {name = "bitflags", versions = ['1.2.1'], options = ['-Wclippy::pedantic', '-Wclippy::cargo']}

It is possible to specify command line options for each crate. This makes it possible to only check a crate for certain lint groups. If no options are specified, the lint groups clippy::all, clippy::pedantic, and clippy::cargo are checked. If an empty array is specified only clippy::all is checked.

Note: -Wclippy::all is always enabled by default, unless -Aclippy::all is explicitly specified in the options.

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",
]