diff --git a/modules/pre-commit.nix b/modules/pre-commit.nix index 3d2bbf6f..319866be 100644 --- a/modules/pre-commit.nix +++ b/modules/pre-commit.nix @@ -17,6 +17,8 @@ let inherit (pkgs) runCommand writeText git; cfg = config.pre-commit; + # TODO: add per-hook stages to install here + install_stages = cfg.default_stages; hookType = types.submodule ( @@ -258,6 +260,18 @@ in default = []; }; + default_stages = + mkOption { + type = types.listOf types.str; + description = + '' + A configuration wide option for the stages property. + Installs hooks to the defined stages. + Default is empty which falls back to 'commit'. + ''; + default = []; + }; + rawConfig = mkOption { type = types.attrs; @@ -286,6 +300,8 @@ in ]; } // lib.optionalAttrs (cfg.excludes != []) { exclude = mergeExcludes cfg.excludes; + } // lib.optionalAttrs (cfg.default_stages != []) { + default_stages = cfg.default_stages; }; pre-commit.installationScript = @@ -315,7 +331,36 @@ in echo 1>&2 " 3. add .pre-commit-config.yaml to .gitignore" else ln -s ${configFile} .pre-commit-config.yaml - pre-commit install + # Remove any previously installed hooks (since pre-commit itself has no convergent design) + hooks="pre-commit pre-merge-commit pre-push prepare-commit-msg commit-msg post-checkout post-commit" + for hook in $hooks; do + pre-commit uninstall -t $hook + done + # Add hooks for configured stages (only) ... + if [ ! -z "${concatStringsSep " " install_stages}" ]; then + for stage in ${concatStringsSep " " install_stages}; do + if [[ "$stage" == "manual" ]]; then + continue + fi + case $stage in + # if you amend these switches please also review $hooks above + commit | merge-commit | push) + stage="pre-"$stage + pre-commit install -t $stage + ;; + prepare-commit-msg | commit-msg | post-checkout | post-commit) + pre-commit install -t $stage + ;; + *) + echo 1>&2 "ERROR: nix-pre-commit-hooks: either $stage is not a valid stage or pre-commit-hooks.nix doesn't yet support it." + exit 1 + ;; + esac + done + # ... or default 'pre-commit' hook + else + pre-commit install + fi fi fi fi diff --git a/nix/run.nix b/nix/run.nix index 601d402e..fc3db11f 100644 --- a/nix/run.nix +++ b/nix/run.nix @@ -5,6 +5,7 @@ builtinStuff@{ pkgs, tools, pre-commit, git, runCommand, writeText, writeScript, , excludes ? [] , tools ? {} , settings ? {} +, default_stages ? [] }: let @@ -32,7 +33,7 @@ let _module.args.pkgs = pkgs; pre-commit = { - inherit hooks excludes settings; + inherit hooks excludes settings default_stages; tools = builtinStuff.tools // tools; }; };