| ## `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 |
| |
| ```toml |
| bitflags = {name = "bitflags", versions = ['1.2.1']} |
| ``` |
| Requires a "name" and one or multiple "versions" to be checked. |
| |
| 2. `git` Source |
| ````toml |
| 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 |
| ```toml |
| clippy = {name = "clippy", path = "/home/user/clippy"} |
| ``` |
| For when you want to add a repository that is not published yet. |
| |
| #### Command Line Options (optional) |
| |
| ```toml |
| 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`: |
| |
| ```toml |
| [crates] |
| cargo = {name = "cargo", versions = ['0.64.0']} |
| |
| [recursive] |
| ignore = [ |
| "unicode-normalization", |
| ] |
| ``` |