{ pkgs, makeNixvim, makeNixvimWithModule, }: let # Create a nix derivation from a nixvim executable. # The build phase simply consists in running the provided nvim binary. mkTestDerivationFromNvim = { name, nvim, dontRun ? false, ... }: pkgs.stdenv.mkDerivation { inherit name; nativeBuildInputs = [ nvim pkgs.docker-client ]; dontUnpack = true; # We need to set HOME because neovim will try to create some files # # Because neovim does not return an exitcode when quitting we need to check if there are # errors on stderr buildPhase = if !dontRun then '' mkdir -p .cache/nvim output=$(HOME=$(realpath .) nvim -mn --headless "+q" 2>&1 >/dev/null) if [[ -n $output ]]; then echo "ERROR: $output" exit 1 fi '' else ''''; # If we don't do this nix is not happy installPhase = '' mkdir $out ''; }; mkTestDerivationFromNixvimModule = { name ? "nixvim-check", pkgs, module, extraSpecialArgs ? { }, }: let nvim = makeNixvimWithModule { inherit pkgs module extraSpecialArgs; _nixvimTests = true; }; in mkTestDerivationFromNvim { inherit name nvim; }; # Create a nix derivation from a nixvim configuration. # The build phase simply consists in running neovim with the given configuration. mkTestDerivation = name: config: let testAttributes = if builtins.hasAttr "tests" config then config.tests else { dontRun = false; }; nvim = makeNixvim (pkgs.lib.attrsets.filterAttrs (n: _: n != "tests") config); in mkTestDerivationFromNvim { inherit name nvim; inherit (testAttributes) dontRun; }; in { inherit mkTestDerivation mkTestDerivationFromNvim mkTestDerivationFromNixvimModule; }