Skip to content

Commit

Permalink
feat: support specifying stages, close cachix#49
Browse files Browse the repository at this point in the history
  • Loading branch information
David Arnold committed Nov 2, 2020
1 parent efdbd6d commit eff2d0d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 2 deletions.
46 changes: 45 additions & 1 deletion modules/pre-commit.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ let
inherit (pkgs) runCommand writeText git;

cfg = config;
install_stages = cfg.default_stages;

hookType =
types.submodule (
Expand Down Expand Up @@ -268,6 +269,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;
Expand Down Expand Up @@ -296,6 +309,8 @@ in
];
} // lib.optionalAttrs (cfg.excludes != [ ]) {
exclude = mergeExcludes cfg.excludes;
} // lib.optionalAttrs (cfg.default_stages != [ ]) {
default_stages = cfg.default_stages;
};

installationScript =
Expand Down Expand Up @@ -325,7 +340,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
Expand Down
3 changes: 2 additions & 1 deletion nix/run.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ builtinStuff@{ pkgs, tools, pre-commit, git, runCommand, writeText, writeScript,
, excludes ? [ ]
, tools ? { }
, settings ? { }
, default_stages ? [ ]
}:
let
sources = import ./sources.nix;
Expand All @@ -18,7 +19,7 @@ let
config =
{
_module.args.pkgs = pkgs;
inherit hooks excludes settings src;
inherit hooks excludes settings src default_stages;
tools = builtinStuff.tools // tools;
};
}
Expand Down

0 comments on commit eff2d0d

Please sign in to comment.