Skip to content

Commit

Permalink
feat: support cargo/runtime dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
mrcjkb committed Sep 4, 2024
1 parent 4509ca6 commit 612be66
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 32 deletions.
16 changes: 12 additions & 4 deletions modules/hooks.nix
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,18 @@ in

# PLEASE keep this sorted alphabetically.
options.settings = {
rust.cargoManifestPath = mkOption {
type = types.nullOr types.str;
description = "Path to Cargo.toml";
default = null;
rust = {
check.cargoDeps = mkOption {
type = types.nullOr types.attrs;
description = "Cargo dependencies needed to run the checks.";
example = "pkgs.rustPlatform.importCargoLock { lockFile = ./Cargo.lock; }";
default = null;
};
cargoManifestPath = mkOption {
type = types.nullOr types.str;
description = "Path to Cargo.toml";
default = null;
};
};
};

Expand Down
66 changes: 38 additions & 28 deletions modules/pre-commit.nix
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ let
;

inherit (pkgs) runCommand writeText git;
inherit (pkgs.rustPlatform) cargoSetupHook;
inherit (pkgs.stdenv) mkDerivation;

cfg = config;
install_stages = lib.unique (builtins.concatLists (lib.mapAttrsToList (_: h: h.stages) enabledHooks));
Expand All @@ -28,6 +30,7 @@ let
if excludes == [ ] then "^$" else "(${concatStringsSep "|" excludes})";

enabledHooks = filterAttrs (id: value: value.enable) cfg.hooks;
enabledExtraPackages = builtins.concatLists (mapAttrsToList (_: value: value.extraRuntimeInputs) cfg.hooks);
processedHooks =
mapAttrsToList (id: value: value.raw // { inherit id; }) enabledHooks;

Expand All @@ -53,34 +56,41 @@ let
);

run =
runCommand "pre-commit-run" { buildInputs = [ git ]; } ''
set +e
HOME=$PWD
# Use `chmod +w` instead of `cp --no-preserve=mode` to be able to write and to
# preserve the executable bit at the same time
cp -R ${cfg.rootSrc} src
chmod -R +w src
ln -fs ${configFile} src/.pre-commit-config.yaml
cd src
rm -rf .git
git init -q
git add .
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
git commit -m "init" -q
if [[ ${toString (compare install_stages [ "manual" ])} -eq 0 ]]
then
echo "Running: $ pre-commit run --hook-stage manual --all-files"
${cfg.package}/bin/pre-commit run --hook-stage manual --all-files
else
echo "Running: $ pre-commit run --all-files"
${cfg.package}/bin/pre-commit run --all-files
fi
exitcode=$?
git --no-pager diff --color
touch $out
[ $? -eq 0 ] && exit $exitcode
'';
mkDerivation {
name = "pre-commit-run";

src = cfg.rootSrc;
buildInputs = [ git ];
nativeBuildInputs = enabledExtraPackages
++ (if config.settings.rust.check.cargoDeps != null
then [
cargoSetupHook
]
else [ ]);
cargoDeps = config.settings.rust.check.cargoDeps;
buildPhase = ''
set +e
HOME=$PWD
ln -fs ${configFile} .pre-commit-config.yaml
git init -q
git add .
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
git commit -m "init" -q
if [[ ${toString (compare install_stages [ "manual" ])} -eq 0 ]]
then
echo "Running: $ pre-commit run --hook-stage manual --all-files"
${cfg.package}/bin/pre-commit run --hook-stage manual --all-files
else
echo "Running: $ pre-commit run --all-files"
${cfg.package}/bin/pre-commit run --all-files
fi
exitcode=$?
git --no-pager diff --color
touch $out
[ $? -eq 0 ] && exit $exitcode
'';
};

failedAssertions = builtins.map (x: x.message) (builtins.filter (x: !x.assertion) config.assertions);

Expand Down

0 comments on commit 612be66

Please sign in to comment.