Skip to content

Commit 0db70b8

Browse files
authored
Merge pull request #14711 from roberth/check-redirect-targets
Check and fix nix-manual redirect targets
2 parents 5f42e5e + c8601a2 commit 0db70b8

File tree

7 files changed

+590
-474
lines changed

7 files changed

+590
-474
lines changed

doc/manual/generate-redirects.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/usr/bin/env python3
2+
"""Generate redirects.js from template and JSON data."""
3+
4+
import sys
5+
6+
template_path, json_path, output_path = sys.argv[1:]
7+
8+
with open(json_path) as f:
9+
json_content = f.read().rstrip()
10+
11+
with open(template_path) as f:
12+
template = f.read()
13+
14+
with open(output_path, 'w') as f:
15+
f.write(template.replace('@REDIRECTS_JSON@', json_content))

doc/manual/meson.build

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ generate_manual_deps = files(
5757
'generate-deps.py',
5858
)
5959

60+
# Generate redirects.js from template and JSON data
61+
redirects_js = custom_target(
62+
'redirects.js',
63+
command : [
64+
python,
65+
'@INPUT0@',
66+
'@INPUT1@',
67+
'@INPUT2@',
68+
'@OUTPUT@',
69+
],
70+
input : [
71+
'generate-redirects.py',
72+
'redirects.js.in',
73+
'redirects.json',
74+
],
75+
output : 'redirects.js',
76+
)
77+
6078
# Generates types
6179
subdir('source/store')
6280
# Generates builtins.md and builtin-constants.md.
@@ -109,6 +127,7 @@ manual = custom_target(
109127
'book.toml.in',
110128
'anchors.jq',
111129
'custom.css',
130+
redirects_js,
112131
nix3_cli_files,
113132
experimental_features_shortlist_md,
114133
experimental_feature_descriptions_md,

doc/manual/package.nix

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{
22
lib,
3+
callPackage,
34
mkMesonDerivation,
5+
runCommand,
46

57
meson,
68
ninja,
@@ -95,22 +97,34 @@ mkMesonDerivation (finalAttrs: {
9597
*/
9698
passthru.site = finalAttrs.finalPackage + "/share/doc/nix/manual";
9799

98-
passthru.tests = {
99-
# https://nixos.org/manual/nixpkgs/stable/index.html#tester-lycheeLinkCheck
100-
linkcheck = testers.lycheeLinkCheck {
101-
inherit (finalAttrs.finalPackage) site;
102-
extraConfig = {
103-
exclude = [
104-
# Exclude auto-generated JSON schema documentation which has
105-
# auto-generated fragment IDs that don't match the link references
106-
".*/protocols/json/.*\\.html"
107-
# Exclude undocumented builtins
108-
".*/language/builtins\\.html#builtins-addErrorContext"
109-
".*/language/builtins\\.html#builtins-appendContext"
110-
];
100+
passthru.tests =
101+
let
102+
redirect-targets = callPackage ./redirect-targets-html.nix { };
103+
in
104+
{
105+
# https://nixos.org/manual/nixpkgs/stable/index.html#tester-lycheeLinkCheck
106+
linkcheck = testers.lycheeLinkCheck {
107+
site =
108+
let
109+
plain = finalAttrs.finalPackage.site;
110+
in
111+
runCommand "nix-manual-with-redirect-targets" { } ''
112+
cp -r ${plain} $out
113+
chmod -R u+w $out
114+
cp ${redirect-targets}/redirect-targets.html $out/redirect-targets.html
115+
'';
116+
extraConfig = {
117+
exclude = [
118+
# Exclude auto-generated JSON schema documentation which has
119+
# auto-generated fragment IDs that don't match the link references
120+
".*/protocols/json/.*\\.html"
121+
# Exclude undocumented builtins
122+
".*/language/builtins\\.html#builtins-addErrorContext"
123+
".*/language/builtins\\.html#builtins-appendContext"
124+
];
125+
};
111126
};
112127
};
113-
};
114128

115129
meta = {
116130
platforms = lib.platforms.all;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Generates redirect-targets.html containing all redirect targets for link checking.
2+
# Used by: doc/manual/package.nix (passthru.tests.linkcheck)
3+
4+
{
5+
stdenv,
6+
lib,
7+
jq,
8+
}:
9+
10+
stdenv.mkDerivation {
11+
name = "redirect-targets-html";
12+
13+
src = lib.fileset.toSource {
14+
root = ./.;
15+
fileset = ./redirects.json;
16+
};
17+
18+
nativeBuildInputs = [ jq ];
19+
20+
installPhase = ''
21+
mkdir -p $out
22+
23+
{
24+
echo '<!DOCTYPE html>'
25+
echo '<html><head><title>Nix Manual Redirect Targets</title></head><body>'
26+
echo '<h1>Redirect Targets to Check</h1>'
27+
echo '<p>This document contains all redirect targets from the Nix manual.</p>'
28+
29+
echo '<h2>Client-side redirects (from redirects.json)</h2>'
30+
echo '<ul>'
31+
32+
# Extract all redirects with their source pages to properly resolve relative paths
33+
jq -r 'to_entries[] | .key as $page | .value | to_entries[] | "\($page)\t\(.value)"' \
34+
redirects.json | while IFS=$'\t' read -r page target; do
35+
36+
page_dir=$(dirname "$page")
37+
38+
# Handle fragment-only targets (e.g., #primitives)
39+
if [[ "$target" == \#* ]]; then
40+
# Fragment is on the same page
41+
resolved="$page$target"
42+
echo "<li><a href=\"$resolved\">$resolved</a> (fragment on $page)</li>"
43+
continue
44+
fi
45+
46+
# Resolve relative path based on the source page location
47+
resolved="$page_dir/$target"
48+
49+
echo "<li><a href=\"$resolved\">$resolved</a> (from $page)</li>"
50+
done
51+
52+
echo '</ul>'
53+
echo '</body></html>'
54+
} > $out/redirect-targets.html
55+
56+
echo "Generated redirect targets document with $(grep -c '<li>' $out/redirect-targets.html) links"
57+
'';
58+
59+
meta = {
60+
description = "HTML document listing all Nix manual redirect targets for link checking";
61+
};
62+
}

0 commit comments

Comments
 (0)