Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/astro/deadnix
Scan Nix files for dead code
https://github.com/astro/deadnix
nix nix-flake nix-lang nixos rnix rust
Last synced: about 17 hours ago
JSON representation
Scan Nix files for dead code
- Host: GitHub
- URL: https://github.com/astro/deadnix
- Owner: astro
- License: gpl-3.0
- Created: 2021-12-05T23:06:43.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-10-27T11:42:15.000Z (about 2 months ago)
- Last Synced: 2024-10-29T17:12:50.628Z (about 1 month ago)
- Topics: nix, nix-flake, nix-lang, nixos, rnix, rust
- Language: Rust
- Homepage:
- Size: 191 KB
- Stars: 502
- Watchers: 4
- Forks: 15
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-nix - deadnix - Scan Nix files for dead code. (Command-Line Tools / Discovery)
README
# deadnix
Scan `.nix` files for dead code (unused variable bindings).
## Usage with Github Actions
See [deadnix-action](https://github.com/astro/deadnix-action)
## Usage with Nix Flakes
### Help
```console
nix run github:astro/deadnix -- --help
Find dead code in .nix filesUsage: deadnix [OPTIONS] [FILE_PATHS]...
Arguments:
[FILE_PATHS]... .nix files, or directories with .nix files inside [default: .]Options:
-l, --no-lambda-arg Don't check lambda parameter arguments
-L, --no-lambda-pattern-names Don't check lambda attrset pattern names (don't break nixpkgs callPackage)
-_, --no-underscore Don't check any bindings that start with a _
-q, --quiet Don't print dead code report
-e, --edit Remove unused code and write to source file
-h, --hidden Recurse into hidden subdirectories and process hidden .*.nix files
--help
-f, --fail Exit with 1 if unused code has been found
-o, --output-format Output format to use [default: human-readable] [possible values: human-readable, json]
--exclude ... Files to exclude from analysis
-V, --version Print version
```Reports contain ANSI color escape codes unless the
[`$NO_COLOR`](https://no-color.org/) environment variable is set.The `--exclude` parameter accepts multiple paths. Separate them with
`--` to pass `[FILE_PATHS]...`.### Scan for unused code
```console
nix run github:astro/deadnix example.nix
Warning: Unused declarations were found.
╭─[example.nix:1:1]
1 │unusedArgs@{ unusedArg, usedArg, ... }:
· │ ╰───── Unused lambda pattern: unusedArg
· ╰───────────────── Unused lambda pattern: unusedArgs
3 │ inherit (builtins) unused_inherit;
· ╰─────── Unused let binding: unused_inherit
5 │ unused = "fnord";
· ╰─── Unused let binding: unused
10 │ shadowed = 42;
· ╰──── Unused let binding: shadowed
11 │ _unused = unused: false;
· │ ╰─── Unused lambda argument: unused
· ╰───────────── Unused let binding: _unused
13 │ x = { unusedArg2, x ? args.y, ... }@args: used1 + x;
· ╰───── Unused lambda pattern: unusedArg2
```### Remove unused code automatically
**Do commit** your changes into version control **before!**
```console
nix run github:astro/deadnix -- -eq test.nix
```## Usage with [pre-commit](https://pre-commit.com/)
Add the following to your project's `.pre-commit-config.yaml`:
```yaml
repos:
- repo: https://github.com/astro/deadnix
rev: ID # frozen: VERSION
hooks:
- id: deadnix
#args: [--edit] # Uncomment to automatically modify files
stages: [commit]
```Replace `ID` and `VERSION` above with the relevant version tag and
commit ID for reference, for example:```yaml
rev: da39a3ee5e6b4b0d3255bfef95601890afd80709 # frozen: v1.2.3
```## Behavior
### Renaming of all unused to lambda args to start with `_`
If you disfavor marking them as unused, use option
`-l`/`--no-lambda-arg`.### nixpkgs `callPackages` with multiple imports
`callPackages` guesses the packages to inject by the names of a
packages' lambda attrset pattern names. Some packages alias these with
`@args` to pass them to another `import ...nix args`.As the used args are only named in the imported file they will be
recognized as dead in the package source file that is imported by
`callPackage`, rendering it unable to guess the dependencies to call
the packages with.Use option `-L`/`--no-lambda-pattern-names` in this case.
### Skipping reports for certain declarations
As of 1.1.0 deadnix supports the following pragma to skip check of
bindings in the following line:```nix
# deadnix: skip
```## What if the produced reports are wrong?
Please open an issue. Do not forget to include the `.nix` code that
produces incorrect results.## Commercial Support
The author can be hired to implement the features that you wish, or to
integrate this tool into your toolchain.