mirror of
https://github.com/NixOS/nix.git
synced 2025-12-08 18:11:02 +01:00
Check nix-manual redirect targets in linkcheck
Augments the manual with a generated file before running the usual check.
This commit is contained in:
parent
3632abb7a5
commit
ee30827e20
2 changed files with 109 additions and 14 deletions
|
|
@ -1,6 +1,8 @@
|
||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
|
callPackage,
|
||||||
mkMesonDerivation,
|
mkMesonDerivation,
|
||||||
|
runCommand,
|
||||||
|
|
||||||
meson,
|
meson,
|
||||||
ninja,
|
ninja,
|
||||||
|
|
@ -95,22 +97,34 @@ mkMesonDerivation (finalAttrs: {
|
||||||
*/
|
*/
|
||||||
passthru.site = finalAttrs.finalPackage + "/share/doc/nix/manual";
|
passthru.site = finalAttrs.finalPackage + "/share/doc/nix/manual";
|
||||||
|
|
||||||
passthru.tests = {
|
passthru.tests =
|
||||||
# https://nixos.org/manual/nixpkgs/stable/index.html#tester-lycheeLinkCheck
|
let
|
||||||
linkcheck = testers.lycheeLinkCheck {
|
redirect-targets = callPackage ./redirect-targets-html.nix { };
|
||||||
inherit (finalAttrs.finalPackage) site;
|
in
|
||||||
extraConfig = {
|
{
|
||||||
exclude = [
|
# https://nixos.org/manual/nixpkgs/stable/index.html#tester-lycheeLinkCheck
|
||||||
# Exclude auto-generated JSON schema documentation which has
|
linkcheck = testers.lycheeLinkCheck {
|
||||||
# auto-generated fragment IDs that don't match the link references
|
site =
|
||||||
".*/protocols/json/.*\\.html"
|
let
|
||||||
# Exclude undocumented builtins
|
plain = finalAttrs.finalPackage.site;
|
||||||
".*/language/builtins\\.html#builtins-addErrorContext"
|
in
|
||||||
".*/language/builtins\\.html#builtins-appendContext"
|
runCommand "nix-manual-with-redirect-targets" { } ''
|
||||||
];
|
cp -r ${plain} $out
|
||||||
|
chmod -R u+w $out
|
||||||
|
cp ${redirect-targets}/redirect-targets.html $out/redirect-targets.html
|
||||||
|
'';
|
||||||
|
extraConfig = {
|
||||||
|
exclude = [
|
||||||
|
# Exclude auto-generated JSON schema documentation which has
|
||||||
|
# auto-generated fragment IDs that don't match the link references
|
||||||
|
".*/protocols/json/.*\\.html"
|
||||||
|
# Exclude undocumented builtins
|
||||||
|
".*/language/builtins\\.html#builtins-addErrorContext"
|
||||||
|
".*/language/builtins\\.html#builtins-appendContext"
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
platforms = lib.platforms.all;
|
platforms = lib.platforms.all;
|
||||||
|
|
|
||||||
81
doc/manual/redirect-targets-html.nix
Normal file
81
doc/manual/redirect-targets-html.nix
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
# Generates redirect-targets.html containing all redirect targets for link checking.
|
||||||
|
# Used by: doc/manual/package.nix (passthru.tests.linkcheck)
|
||||||
|
|
||||||
|
{
|
||||||
|
stdenv,
|
||||||
|
lib,
|
||||||
|
jq,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "redirect-targets-html";
|
||||||
|
|
||||||
|
src = lib.fileset.toSource {
|
||||||
|
root = ./.;
|
||||||
|
fileset = lib.fileset.unions [
|
||||||
|
./source/_redirects
|
||||||
|
./redirects.json
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ jq ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out
|
||||||
|
|
||||||
|
{
|
||||||
|
echo '<!DOCTYPE html>'
|
||||||
|
echo '<html><head><title>Nix Manual Redirect Targets</title></head><body>'
|
||||||
|
echo '<h1>Redirect Targets to Check</h1>'
|
||||||
|
echo '<p>This document contains all redirect targets from the Nix manual.</p>'
|
||||||
|
|
||||||
|
echo '<h2>Server-side redirects (from _redirects)</h2>'
|
||||||
|
echo '<ul>'
|
||||||
|
|
||||||
|
# Extract targets from _redirects file (second field, skip comments and empty lines)
|
||||||
|
grep -v '^#' source/_redirects | grep -v '^$' | while read -r source target code; do
|
||||||
|
# Handle splat patterns by converting to a concrete example
|
||||||
|
if [[ "$target" == *":splat"* ]]; then
|
||||||
|
target="''${target//:splat/example}"
|
||||||
|
fi
|
||||||
|
# Remove leading slash for relative path
|
||||||
|
target="''${target#/}"
|
||||||
|
echo "<li><a href=\"$target\">$target</a> (from $source)</li>"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo '</ul>'
|
||||||
|
|
||||||
|
echo '<h2>Client-side redirects (from redirects.json)</h2>'
|
||||||
|
echo '<ul>'
|
||||||
|
|
||||||
|
# Extract all redirects with their source pages to properly resolve relative paths
|
||||||
|
jq -r 'to_entries[] | .key as $page | .value | to_entries[] | "\($page)\t\(.value)"' \
|
||||||
|
redirects.json | while IFS=$'\t' read -r page target; do
|
||||||
|
|
||||||
|
page_dir=$(dirname "$page")
|
||||||
|
|
||||||
|
# Handle fragment-only targets (e.g., #primitives)
|
||||||
|
if [[ "$target" == \#* ]]; then
|
||||||
|
# Fragment is on the same page
|
||||||
|
resolved="$page$target"
|
||||||
|
echo "<li><a href=\"$resolved\">$resolved</a> (fragment on $page)</li>"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Resolve relative path based on the source page location
|
||||||
|
resolved="$page_dir/$target"
|
||||||
|
|
||||||
|
echo "<li><a href=\"$resolved\">$resolved</a> (from $page)</li>"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo '</ul>'
|
||||||
|
echo '</body></html>'
|
||||||
|
} > $out/redirect-targets.html
|
||||||
|
|
||||||
|
echo "Generated redirect targets document with $(grep -c '<li>' $out/redirect-targets.html) links"
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "HTML document listing all Nix manual redirect targets for link checking";
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue