diff --git a/.gitignore b/.gitignore index b2be92b..58399cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ result +.pre-commit-config.yaml diff --git a/flake.lock b/flake.lock index d79f675..a712d89 100644 --- a/flake.lock +++ b/flake.lock @@ -32,6 +32,51 @@ "type": "github" } }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1742649964, + "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1747179050, @@ -68,6 +113,7 @@ "inputs": { "blobs": "blobs", "flake-compat": "flake-compat", + "git-hooks": "git-hooks", "nixpkgs": "nixpkgs", "nixpkgs-24_11": "nixpkgs-24_11" } diff --git a/flake.nix b/flake.nix index dac72f8..8a154da 100644 --- a/flake.nix +++ b/flake.nix @@ -6,6 +6,11 @@ url = "github:edolstra/flake-compat"; flake = false; }; + git-hooks = { + url = "github:cachix/git-hooks.nix"; + inputs.flake-compat.follows = "flake-compat"; + inputs.nixpkgs.follows = "nixpkgs"; + }; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-24_11.url = "github:NixOS/nixpkgs/nixos-24.11"; blobs = { @@ -14,7 +19,7 @@ }; }; - outputs = { self, blobs, nixpkgs, nixpkgs-24_11, ... }: let + outputs = { self, blobs, git-hooks, nixpkgs, nixpkgs-24_11, ... }: let lib = nixpkgs.lib; system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; @@ -123,7 +128,51 @@ hydraJobs.${system} = allTests // { inherit documentation; }; - checks.${system} = allTests; + checks.${system} = allTests // { + pre-commit = git-hooks.lib.${system}.run { + src = ./.; + hooks = { + # docs + markdownlint = { + enable = true; + settings.configuration = { + # Max line length, doesn't seem to correclty account for lines containing links + # https://github.com/DavidAnson/markdownlint/blob/main/doc/md013.md + MD013 = false; + }; + }; + rstcheck = { + enable = true; + entry = lib.getExe pkgs.rstcheckWithSphinx; + files = "\\.rst$"; + }; + + # nix + deadnix.enable = true; + + # python + pyright.enable = true; + ruff = { + enable = true; + args = [ + "--extend-select" + "I" + ]; + }; + ruff-format.enable = true; + + # scripts + shellcheck.enable = true; + + # sieve + check-sieve = { + enable = true; + entry = lib.getExe pkgs.check-sieve; + files = "\\.sieve$"; + }; + }; + }; + }; packages.${system} = { inherit optionsDoc documentation; }; @@ -131,7 +180,8 @@ inputsFrom = [ documentation ]; packages = with pkgs; [ clamav - ]; + ] ++ self.checks.${system}.pre-commit.enabledPackages; + shellHook = self.checks.${system}.pre-commit.shellHook; }; devShell.${system} = self.devShells.${system}.default; # compatibility };