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 43da434
Show file tree
Hide file tree
Showing 2 changed files with 49 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
65 changes: 37 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 Down Expand Up @@ -53,34 +55,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 "you@example.com"
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 = config.extraPackages
++ (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 "you@example.com"
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 43da434

Please sign in to comment.