Skip to content

A fast semantic linter for Nix using tree-sitter 🌳 + ❄️. [maintainers=@Artturin,@siraben]

License

Notifications You must be signed in to change notification settings

nix-community/nixpkgs-lint

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Jun 2, 2023
da6b3da Β· Jun 2, 2023

History

94 Commits
Mar 6, 2023
Dec 8, 2022
Apr 22, 2023
Apr 20, 2023
Apr 20, 2023
Jun 2, 2023
Jun 2, 2023
Sep 25, 2022
Apr 6, 2022
Apr 18, 2023
Apr 18, 2023
Sep 25, 2022
Dec 8, 2022
Apr 7, 2022

Repository files navigation

Semantic linter for Nixpkgs using tree-sitter 🌳 + ❄️

asciicast

This is a semantic linter for Nixpkgs that uses tree-sitter. Currently we have the following detections:

  • cmake, makeWrapper, pkg-config in buildInputs
  • redundant packages from stdenv in nativeBuildInputs

Features

  • Fast: lints all of Nixpkgs in under 3 seconds
  • Semantic linting: forget about hacking up regexes, we run queries directly on parse trees created by tree-sitter
  • Syntax-aware: nixpkgs-lint can easily handle multi-line expressions, eliminates false-positives from strings and comments and gives exact spans for matches
  • Robust: lint Nix files even in the presence of syntax errors
  • Hackable: create your own lints by writing queries or Rust code

Usage

To use without installing, run nix run github:nix-community/nixpkgs-lint.

The tool will recurse through every .nix file in the provided path(,s).

$ nix build 
$ ./result/bin/nixpkgs-lint <files or directories>

Motivation

Why another linter? My motivation for this was spawned after doing a series of treewide PRs such as moving cmake to buildInputs. The strategy was similar each time; write some shell one-liner to go through every file (27,000+ of them) in Nixpkgs and find some anti-pattern to fix. However, this is quickly problematic for multiple reasons:

  • it is hard to account for multi-line expressions
  • it is hard to filter out false positives
  • it is hard to query for more complex features

In general discussions on IRC and Matrix, a more AST-aware approach to linting was viewed favorably but not many people took it on, despite the availability of Nix parsers in various languages. I have some subjective reasons myself:

  • need to learn the AST representation in the respective library
  • need to traverse the AST with a query
  • need to locate this information back to a source location

Often one or more of these would be pretty involved. Furthermore, it locks you into a specific parser (which may or may not have provided source information, parse all things correctly, etc.).

Enter tree-sitter. The Nix grammar for tree-sitter has been well-tested and tree-sitter having bindings in several languages gives you options in how to work with the resulting AST. You also get things like a location-annotated AST and error recovery for free.

License

This repository is licensed under the MIT license.

About

A fast semantic linter for Nix using tree-sitter 🌳 + ❄️. [maintainers=@Artturin,@siraben]

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published