From 9dd107a1d5395fae9b969597e02f3ef3a43ddd47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Tue, 27 Jun 2023 23:32:30 +0200 Subject: [PATCH] flake: add formatter (#3620) * format: improve argument handling For now, fail if the user tries to format a specific file/directory, or runs the formatter from within a subdirectory. Handling these situations is slightly tricky because `find -path` is not very flexible. * flake: add formatter This allows running the formatter with `nix fmt`, added in Nix 2.8. * format: use git ls-files This is cleaner than `find` and allows us to restrict formatting to particular files or subdirectories. --- flake.nix | 9 +++++++- format | 66 +++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/flake.nix b/flake.nix index 0b7eaa91..5e354f78 100644 --- a/flake.nix +++ b/flake.nix @@ -55,7 +55,7 @@ - 'system' have been removed. Instead use the arguments 'pkgs' and - 'modules'. See the 22.11 release notes for more: https://nix-community.github.io/home-manager/release-notes.html#sec-release-22.11-highlights + 'modules'. See the 22.11 release notes for more: https://nix-community.github.io/home-manager/release-notes.html#sec-release-22.11-highlights ''; throwForRemovedArgs = v: @@ -93,6 +93,13 @@ tests = import ./tests { inherit pkgs; }; in tests.run); + formatter = forAllSystems (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in pkgs.linkFarm "format" [{ + name = "bin/format"; + path = ./format; + }]); + packages = forAllSystems (system: let pkgs = nixpkgs.legacyPackages.${system}; diff --git a/format b/format index ef5528b7..ff4b32e4 100755 --- a/format +++ b/format @@ -1,27 +1,51 @@ #! /usr/bin/env nix-shell -#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/6616de389ed55fba6eeba60377fc04732d5a207c.tar.gz -i bash -p findutils nixfmt +#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/6616de389ed55fba6eeba60377fc04732d5a207c.tar.gz -i bash -p git gnugrep gnused findutils nixfmt -CHECK_ARG= +nixfmt_args=() +files=() -case $1 in - -h) - echo "$0 [-c]" - ;; - -c) - CHECK_ARG=-c - ;; -esac +for arg do + case $arg in + -h) + echo "$0 [-c]" + exit + ;; + -c) + nixfmt_args+=("$arg") + ;; + -*) + echo "unrecognised flag: $arg" >&2 + exit 1 + ;; + *) + files+=("$arg") + ;; + esac +done # The excludes are for files touched by open pull requests and we want # to avoid merge conflicts. -find . -name '*.nix' \ - ! -path ./modules/default.nix \ - ! -path ./modules/files.nix \ - ! -path ./modules/home-environment.nix \ - ! -path ./modules/lib/default.nix \ - ! -path ./modules/lib/file-type.nix \ - ! -path ./modules/misc/news.nix \ - ! -path ./modules/programs/ssh.nix \ - ! -path ./modules/programs/zsh.nix \ - ! -path ./tests/default.nix \ - -exec nixfmt $CHECK_ARG {} + +excludes=( + modules/default.nix + modules/files.nix + modules/home-environment.nix + modules/lib/default.nix + modules/lib/file-type.nix + modules/misc/news.nix + modules/programs/ssh.nix + modules/programs/zsh.nix + tests/default.nix +) + +exclude_args=() +for e in "${excludes[@]}"; do + exclude_args+=(-e "$e") +done + +git_root=$(git rev-parse --show-toplevel) + +git ls-files -z --cached --others --full-name -- "${files[@]}" | + grep -z '\.nix$' | + grep -z -v "${exclude_args[@]}" | + sed -z "s|^|$git_root/|" | + xargs -0 nixfmt "${nixfmt_args[@]}"