nixpkgs/pkgs/build-support/testers/lychee.nix
2024-07-18 14:15:53 +03:00

70 lines
2.1 KiB
Nix

deps@{ formats, lib, lychee, stdenv, writeShellApplication }:
let
inherit (lib) mapAttrsToList throwIf;
inherit (lib.strings) hasInfix hasPrefix escapeNixString;
toURL = v:
let s = "${v}";
in if hasPrefix builtins.storeDir s
then # lychee requires that paths on the file system are prefixed with file://
"file://${s}"
else s;
withCheckedName = name:
throwIf (hasInfix " " name) ''
lycheeLinkCheck: remap patterns must not contain spaces.
A space marks the end of the regex in lychee.toml.
Please change attribute name 'remap.${escapeNixString name}'
'';
# See https://nixos.org/manual/nixpkgs/unstable/#tester-lycheeLinkCheck
# or doc/build-helpers/testers.chapter.md
lycheeLinkCheck = {
site,
remap ? { },
lychee ? deps.lychee,
extraConfig ? { },
}:
stdenv.mkDerivation (finalAttrs: {
name = "lychee-link-check";
inherit site;
nativeBuildInputs = [ finalAttrs.passthru.lychee ];
configFile = (formats.toml {}).generate "lychee.toml" finalAttrs.passthru.config;
# These can be overriden with overrideAttrs if needed.
passthru = {
inherit lychee remap;
config = {
include_fragments = true;
} // lib.optionalAttrs (finalAttrs.passthru.remap != { }) {
remap =
mapAttrsToList
(name: value: withCheckedName name "${name} ${toURL value}")
finalAttrs.passthru.remap;
} // extraConfig;
online = writeShellApplication {
name = "run-lychee-online";
runtimeInputs = [ finalAttrs.passthru.lychee ];
# Comment out to run shellcheck:
checkPhase = "";
text = ''
site=${finalAttrs.site}
configFile=${finalAttrs.configFile}
echo Checking links on $site
exec lychee --config $configFile $site "$@"
'';
};
};
buildCommand = ''
echo Checking internal links on $site
lychee --offline --config $configFile $site
touch $out
'';
});
in
{
inherit lycheeLinkCheck;
}